Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Link to a .lib file in Visual C++ 2010? Without referencing the project?

I just have a problem that I have been trying to fix for the longest time.

I have a static library project in visual c++, and I want another project to be able to link to it. Up until now, I have simply been adding a reference to the static library project, which automatically links the library.

I want to be able to link to the library using only the header files and the .lib file. However, I get a "Unresolved external symbol" error.

I thought I was doing it right - I specified the include directory, the library directory, and went into the linker input properties and provided the lib as an additional dependency.

I am able to reference other static libraries this way (like SDL), so why do I get errors when I try to reference mine?

Thanks for the help.

Is the problem that its not referencing the actual lib file, or is something within the lib itself? These are the error messages I get:

Error 2 error LNK2019: unresolved external symbol "public: void __thiscall XEngine::XCore::XScreen::init(class XEngine::XCore::XGame &)" (?init@XScreen@XCore@XEngine@@QAEXAAVXGame@23@@Z) referenced in function "void __cdecl XEngine::XEngineInit(class XEngine::XCore::XScreen &,class XEngine::XCore::XGame &)" (?XEngineInit@XEngine@@YAXAAVXScreen@XCore@1@AAVXGame@31@@Z) C:\Users\Xander Masotto\Documents\Visual Studio 2010\Projects\Pong\Pong\source.obj Pong

Error 3 error LNK2019: unresolved external symbol "public: __thiscall XEngine::XCore::XScreen::~XScreen(void)" (??1XScreen@XCore@XEngine@@QAE@XZ) referenced in function "void __cdecl XEngine::XEngineInit(class XEngine::XCore::XGame &)" (?XEngineInit@XEngine@@YAXAAVXGame@XCore@1@@Z) C:\Users\Xander Masotto\Documents\Visual Studio 2010\Projects\Pong\Pong\source.obj Pong

Error 4 error LNK2019: unresolved external symbol "public: __thiscall XEngine::XCore::XScreen::XScreen(void)" (??0XScreen@XCore@XEngine@@QAE@XZ) referenced in function "void __cdecl XEngine::XEngineInit(class XEngine::XCore::XGame &)" (?XEngineInit@XEngine@@YAXAAVXGame@XCore@1@@Z) C:\Users\Xander Masotto\Documents\Visual Studio 2010\Projects\Pong\Pong\source.obj Pong

like image 379
user434565 Avatar asked Oct 14 '22 00:10

user434565


1 Answers

Make sure that you are exporting the functions, classes, and variables in your library that you want exposed to other applications (i.e. your dll or exe). By default they are not exposed.

The ground work to do this is typically layed out when you create the project for your library.

#ifdef TESTLIB_EXPORTS
#define TESTLIB_API __declspec(dllexport)
#else
#define TESTLIB_API __declspec(dllimport)
#endif

With the code above generated during project creation there are only two more things for me to do to expose functions,classes, or variables:

1) Make sure that I have TESTLIB_EXPORTS defined as a preprocessor. Project settings: C++/Preprocessor/PreprocessorDefinitions

2) Use the TESTLIB_API define on each function,class, or variable i want exposed:

class TESTLIB_API Order {
    void doSomething();
};
like image 141
skimobear Avatar answered Oct 19 '22 02:10

skimobear