Что вызывает разницу в искаженных именах при компиляции на одном и том же компиляторе (vc12)?

В настоящее время я пытаюсь скомпилировать и связать библиотеку 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

Так что имена, которые на самом деле существуют, немного отличаются от имен, которые ожидают мои проекты, и я понятия не имею, что вызывает эту проблему. Есть ли опция компиляции, которая вызывает эти изменения, или я использую другой компилятор, хотя я думаю, что это то же самое?

2

Решение

Запустить утилита 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 версию вашей программы.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]