Как сделать ссылку на файл .lib в Visual C ++ 2010? Без ссылки на проект? - PullRequest
5 голосов
/ 10 сентября 2010

У меня просто проблема, которую я пытался решить в течение самого длительного времени.

У меня есть проект статической библиотеки в Visual C ++, и я хочу, чтобы другой проект мог ссылаться на него. До сих пор я просто добавлял ссылку на проект статической библиотеки, которая автоматически связывает библиотеку.

Я хочу иметь возможность ссылаться на библиотеку, используя только заголовочные файлы и файл .lib. Однако я получаю сообщение об ошибке «Неразрешенный внешний символ».

Я подумал, что все делаю правильно - я указал каталог include, каталог библиотеки, и вошел в свойства ввода компоновщика и предоставил lib в качестве дополнительной зависимости.

Я могу ссылаться на другие статические библиотеки (например, SDL), так почему я получаю ошибки, когда пытаюсь сослаться на мою?

Спасибо за помощь.

Проблема в том, что он не ссылается на фактический файл lib, или это что-то внутри самой библиотеки? Это сообщения об ошибках, которые я получаю:

Ошибка 2 Ошибка LNK2019: неразрешенный внешний символ «public: void __thiscall XEngine :: XCore :: XScreen :: init (класс XEngine :: XCore :: XGame &)» (? Init @ XScreen @ XCore @ XEngine @@ QAEXAAVXGame @ 23 @@ Z) ссылка на функцию "void __cdecl XEngine :: XEngineInit (класс XEngine :: XCore :: XScreen &, класс XEngine :: XCore :: XGame &)" (? XEngineInit @ XEngine @@ YAXAAVXScreen @ XCore @ 1 @ AAVXGame @ 31 @@ Z) C: \ Users \ Xander Masotto \ Documents \ Visual Studio 2010 \ Проекты \ Понг \ Понг \ source.obj Понг

Ошибка 3, ошибка LNK2019: неразрешенный внешний символ «public: __thiscall XEngine :: XCore :: XScreen :: ~ XScreen (void)» (?? 1XScreen @ XCore @ XEngine @@ QAE @ XZ), на который есть ссылка в функции «void __cdecl» XEngine :: XEngineInit (класс XEngine :: XCore :: XGame &) "(? XEngineInit @ XEngine @@ YAXAAVXGame @ XCore @ 1 @@ Z) C: \ Users \ Xander Masotto \ Documents \ Visual Studio 2010 \ Проекты \ Понг \ Понг \ source.obj Понг

Ошибка 4, ошибка LNK2019: неразрешенный внешний символ "public: __thiscall XEngine :: XCore :: XScreen :: XScreen (void)" (?? 0XScreen @ XCore @ XEngine @@ QAE @ XZ), на который есть ссылка в функции "void __cdecl XEngine" :: XEngineInit (класс XEngine :: XCore :: XGame &) "(? XEngineInit @ XEngine @@ YAXAAVXGame @ XCore @ 1 @@ Z) C: \ Users \ Xander Masotto \ Documents \ Visual Studio 2010 \ Проекты \ Понг \ Понг \ source.obj Pong

1 Ответ

4 голосов
/ 10 сентября 2010

Убедитесь, что вы экспортируете функции, классы и переменные в вашей библиотеке, которые вы хотите использовать в других приложениях (например, в вашей DLL или EXE). По умолчанию они не выставлены.

Основу для этого обычно выкладывают при создании проекта для вашей библиотеки.

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

С помощью кода выше, сгенерированного во время создания проекта, я могу сделать только две вещи, чтобы представить функции, классы или переменные:

1) Убедитесь, что у меня TESTLIB_EXPORTS определен как препроцессор. Настройки проекта: C ++ / Препроцессор / PreprocessorDefinitions

2) Используйте определение TESTLIB_API для каждой функции, класса или переменной, которую я хочу предоставить:

class TESTLIB_API Order {
    void doSomething();
};
...