Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Creation of global class in a DLL

Posted on 2011-03-11
6
Medium Priority
?
408 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
6 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 35110214
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
ID: 35110315
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 2000 total points
ID: 35110358
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
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:Vashren
ID: 35110455
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 2000 total points
ID: 35110923
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
ID: 35112284
Thanks. Time to gobble up some points!
0

Featured Post

NFR key for Veeam Agent for Linux

Veeam is happy to provide a free NFR license for one year.  It allows for the non‑production use and valid for five workstations and two servers. Veeam Agent for Linux is a simple backup tool for your Linux installations, both on‑premises and in the public cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Computer science students often experience many of the same frustrations when going through their engineering courses. This article presents seven tips I found useful when completing a bachelors and masters degree in computing which I believe may he…
Article by: evilrix
Looking for a way to avoid searching through large data sets for data that doesn't exist? A Bloom Filter might be what you need. This data structure is a probabilistic filter that allows you to avoid unnecessary searches when you know the data defin…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
Progress

636 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