В настоящее время я пытаюсь скомпилировать и связать библиотеку CppUTest с моим проектом. Я использую CMake для создания решения Visual Studio 2013 для библиотеки CppUTest, и она собирается.
Однако, когда я связываю созданный CppUTest.lib с моим приложением, я получаю ошибку компоновщика, говорящую мне, что он не может найти несколько символов, таких как
??0Utest@@QAE@XZ)
или же
?RunAllTests@CommandLineTestRunner@@SAHHPAPAD@Z
Теперь, когда я использую dumpbin.exe в lib и параметр / LINKERMEMBER, я получаю список символов в библиотеке, который включает имена
??0Utest@@QEAA@XZ
а также
?RunAllTests@CommandLineTestRunner@@SAHHPEAPEAD@Z
Так что имена, которые на самом деле существуют, немного отличаются от имен, которые ожидают мои проекты, и я понятия не имею, что вызывает эту проблему. Есть ли опция компиляции, которая вызывает эти изменения, или я использую другой компилятор, хотя я думаю, что это то же самое?
Запустить утилита undname.exe из командной строки Visual Studio. Ты получаешь:
Undecoration of :- "??0Utest@@QAE@XZ"is :- "public: __thiscall Utest::Utest(void)"
а также
Undecoration of :- "??0Utest@@QEAA@XZ"is :- "public: __cdecl Utest::Utest(void) __ptr64"
Достаточно ясно, что это конструктор по умолчанию для класса Utest. Обратите внимание, что соглашение о вызовах отличается, __thiscall против __cdecl. И как версия библиотеки имеет атрибут __ptr64.
Вы видите, что атрибут появляется в 64-битных функциях. x64 имеет только одно соглашение о вызовах и не различает __cdecl и __thiscall.
Так что это должно начать становиться очевидным, компоновщик хочет первую, 32-битную версию конструктора. Предоставленная вами 64-битная версия никогда не сможет работать, поскольку вы не можете смешивать 32-битный и 64-битный код. Также должно быть громкое предупреждение об этом, не игнорируйте такие предупреждения.
Ссылка на 32-битную сборку этой библиотеки, чтобы решить вашу проблему. Или соберите x64 версию вашей программы.
Других решений пока нет …