Solved

Creation of global class in a DLL

Posted on 2011-03-11
6
389 Views
Last Modified: 2012-08-13
Hi,

I am building is a series of .lib files that come together to form a single DLL. I also have a class called TestObject that manages some data.

Objectives:
1. A single TestObject instance must be globally accessible by all functions in the DLL libs.
2. DllMain should do some init + cleanup of the global TestObject.

The immediate problem is that I can't get past the linker:

error LNK2019: unresolved external symbol "public: __thiscall TestObject::~TestObject(void)" (??1TestObject@@QAE@XZ) referenced in function "void __cdecl `dynamic atexit destructor for 'testObj''(void)" (??__FtestObj@@YAXXZ)      mylib.lib
error LNK2019: unresolved external symbol "public: __thiscall TestObject::TestObject(void)" (??0TestObject@@QAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'testObj''(void)" (??__EtestObj@@YAXXZ)      mylib.lib
error LNK2019: unresolved external symbol "public: void __thiscall TestObject::PublicFunc(void)" (?PublicFunc@TestObject@@QAEXXZ) referenced in function _DllMain@12      mylib.lib

See code below. Should the TestObject reside elsewhere to be global? How can I get past the linker and have TestObject be fully global?

Thanks,
- Vashren
#include "TestObject.h"

TestObject g_testObj;

//----------------------------------------------------
// DllMain()
//----------------------------------------------------
BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, VOID* pReserved)
{
    g_testObj.PublicFunc();

    switch (dwReason)
    {
        case DLL_PROCESS_ATTACH:
            // some init of testObj
            break;
        case DLL_PROCESS_DETACH:
            // some cleanup of testObj
            break;
        default:
            break;
    }

    return TRUE;
}

Open in new window

0
Comment
Question by:Vashren
  • 3
  • 3
6 Comments
 
LVL 86

Expert Comment

by:jkr
Comment Utility
Well, it just seems that you have not provided both a constructor and a destructor for your class - are you linking with 'TestObject.cpp'?
0
 

Author Comment

by:Vashren
Comment Utility
TestObject.cpp contains an implementation of the constructor & destructor.

However, I'm not well versed with the linker. Do you mean to say I need to do something with the CPP file?
0
 
LVL 86

Accepted Solution

by:
jkr earned 500 total points
Comment Utility
You need to add that file to your project, otherwise it won't be compiled or linked wirth and cause the errors you mentioned in your question. Right-click pn your projext, choose 'Add|Existing Item' and add 'TestObject.cpp'. "'Project|Add existing Item' (CTRL+SHIFT+A) will do the same.
0
Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

 

Author Comment

by:Vashren
Comment Utility
Awesome - it builds correctly now.

With the linker out of the way, I'll now see of the "globalness" works.
0
 
LVL 86

Assisted Solution

by:jkr
jkr earned 500 total points
Comment Utility
Should work fine ;o)

BTW, you might be interested in the http://en.wikipedia.org/wiki/Singleton_pattern - this takes the whole concept of 'global objects' to a new pattern. See also http://www.codeproject.com/KB/cpp/singleton_template.aspx ("A Singleton Template Class") for an example.
0
 

Author Comment

by:Vashren
Comment Utility
Thanks. Time to gobble up some points!
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

This article will show, step by step, how to integrate R code into a R Sweave document
Entering time in Microsoft Access can be difficult. An input mask often bothers users more than helping them and won't catch all typing errors. This article shows how to create a textbox for 24-hour time input with full validation politely catching …
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now