Я только что сделал решение в Microsoft Visual C ++ 2010 Express, содержащее два проекта статических библиотек (lib1 и lib2) и проект приложения (основной) с описанным вами содержимым, и смог воспроизвести вашу проблему. Вот полный результат сборки, который я получаю:
1>------ Build started: Project: lib1, Configuration: Debug Win32 ------
1> MyClass.cpp
1> lib1.vcxproj -> c:\users\samuel windwer\documents\visual studio 2010\Projects\linker_test\Debug\lib1.lib
2>------ Build started: Project: lib2, Configuration: Debug Win32 ------
2> MyClass.cpp
2> Replacing Debug\MyClass.obj
2> lib2.vcxproj -> c:\users\samuel windwer\documents\visual studio 2010\Projects\linker_test\Debug\lib2.lib
3>------ Build started: Project: main, Configuration: Debug Win32 ------
3> main.cpp
3>lib2.lib(MyClass.obj) : error LNK2019: unresolved external symbol "public: __thiscall LIB1::MyClass::MyClass(void)" (??0MyClass@LIB1@@QAE@XZ) referenced in function "public: __thiscall LIB2::MyClass::MyClass(void)" (??0MyClass@LIB2@@QAE@XZ)
3>lib2.lib(MyClass.obj) : error LNK2019: unresolved external symbol "public: __thiscall LIB1::MyClass::~MyClass(void)" (??1MyClass@LIB1@@QAE@XZ) referenced in function "public: __thiscall LIB2::MyClass::~MyClass(void)" (??1MyClass@LIB2@@QAE@XZ)
3>c:\users\samuel windwer\documents\visual studio 2010\Projects\linker_test\Debug\main.exe : fatal error LNK1120: 2 unresolved externals
========== Build: 2 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Сообщение «Замена Debug \ MyClass.obj» проливает свет на проблему. Это сообщение было отправлено диспетчером библиотек Microsoft (LIB.EXE) при сборке lib2.lib. Чтобы понять это сообщение, важно точно понимать, что такое файл статической библиотеки (.lib), и, по расширению, что именно делает LIB.EXE.
Перво-наперво: при создании статической библиотеки код фактически не связывается. Файл .lib - это просто архив, содержащий внутри один или несколько файлов .obj. Другими словами, цель файла .lib - предоставить удобный способ распространения коллекции файлов .obj как одного файла. Все, что делает LIB.EXE, - это упаковывает файлы .obj проекта в файл .lib. LIB.EXE также имеет параметры для других действий с файлами .lib, таких как перечисление всех содержащихся файлов .obj и их извлечение; см. MSDN для получения дополнительной информации.
В вашем вопросе указано, что "lib2 ссылается на lib1." Я предполагаю, что это означает, что вы помещаете lib1.lib в качестве «дополнительной зависимости» в настройки проекта lib2, как показано на этом снимке экрана:
![введите описание изображения здесь](https://i.stack.imgur.com/SWnAj.jpg)
Чтобы точно понять, что делает добавление файла .lib в качестве «дополнительной зависимости» такого проекта статической библиотеки, после изменения этого параметра, я выполнил процедуру в этот ответ, чтобы увидеть командную строку, которая используется при запуске LIB.EXE для сборки lib2.lib. Вот это:
lib.exe "/OUT:c:\users\samuel windwer\documents\visual studio 2010\Projects\linker_test\Debug\lib2.lib" lib1.lib /LIBPATH:..\Debug Debug\MyClass.obj
Эта команда создает новый файл статической библиотеки с именем lib2.lib, который содержит все файлы .obj в lib1.lib, а также MyClass.obj. Тот факт, что lib1.lib также содержит объект с именем MyClass.obj, является источником вашей проблемы. Как указано в документации LIB.EXE в MSDN:
Чтобы заменить член библиотеки новым объектом, укажите библиотеку, содержащую заменяемый элемент, и имя файла для нового объекта (или библиотеки, которая его содержит). Когда объект с таким же именем существует более чем в одном входном файле, LIB помещает последний объект, указанный в команде LIB, в выходную библиотеку.
Сообщение «Замена Debug \ MyClass.obj» выводится на консоль, когда LIB.EXE видит второй экземпляр MyClass.obj, поскольку считает, что второй MyClass.obj должен заменить первый. Переименование одного из файлов MyClass.cpp в MyClass1.cpp устраняет эту проблему, поскольку больше не существует двух объектных файлов с именем MyClass.obj, поэтому они оба могут счастливо жить вместе в одном файле .lib.
Похоже, вы уже нашли обходные пути для этого, но, надеюсь, теперь вы понимаете поведение, которое наблюдаете.
person
chess007
schedule
06.02.2012