Я пытаюсь скомпилировать примеры для API LeapMotion, используя mingw на cygwin.
Когда я компилирую с помощью mingw64, он отлично работает:
x86_64-w64-mingw32-g++ -s -I ../include -L ../lib/x64/ ExampleConnection.cpp -lLeapC PollingSample.cpp -oPollingSample
но если я переключусь на 32 бит:
i686-w64-mingw32-g++ -s -I ../include -L ../lib/x86/ ExampleConnection.cpp -lLeapC PollingSample.cpp -oPollingSample
Я получил:
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x31): undefined reference to `LeapCreateConnection'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x52): undefined reference to `LeapOpenConnection'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0xb5): undefined reference to `LeapCloseConnection'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0xe7): undefined reference to `LeapDestroyConnection'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0xfd): undefined reference to `LeapDestroyConnection'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x16a): undefined reference to `LeapOpenDevice'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x1d2): undefined reference to `LeapGetDeviceInfo'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x205): undefined reference to `LeapGetDeviceInfo'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x26d): undefined reference to `LeapCloseDevice'
/usr/lib/gcc/i686-w64-mingw32/10/../../../../i686-w64-mingw32/bin/ld: /tmp/ccg2UNs3.o:ExampleConnection.cpp:(.text+0x4ac): undefined reference to `LeapPollConnection'
collect2: error: ld returned 1 exit status
Я пытался изменить положение -lLeapC в командной строке и инвертировать порядок файлов .cpp, но всегда получаю одну и ту же ошибку.
в /lib/x86 есть только LeapC.lib и LeapC.dll, те же имена файлов, что и в /lib/x64
.lib обычно означает MSVC. MinGW использует .a для статических библиотек и .dll.a для общих библиотек (вместе с .dll).
но 64-битная версия работает нормально, и имена файлов такие же
Вы можете проверить, какие символы экспортирует файл DLL (например, с помощью pexports
)?
Я только что нашел различия из-за искажения имен, например. LeapCloseConnection (64-битный) и _LeapCloseConnection@4 (32-битный), в противном случае они экспортируют точно такие же символы. В любом случае, я решил проблему, как описано в моем ответе ниже.
Я решил проблему, преобразовав LeapC.lib в LeapC.a в /lib/x86/ (и удалив LeapC.lib из папки)
gendef LeapC.dll //this generates LeapC.def
i686-w64-mingw32-dlltool.exe --def LeapC.def --dllname LeapC.dll --output-lib LeapC.a
Обратите внимание, что обычно вы не можете связать код C++, сгенерированный двумя компиляторами. Если это работает, вам просто повезло, что вы не используете ту или иную языковую функцию или не столкнулись с проблемой. Тот факт, что компоновщик находит свои символы, не означает, что ABI, обработка исключений и даже стандартные библиотечные типы или даже распределитель в этих двух частях кода одинаковы.
У вас есть нужные 32 библиотеки (
libLeapC.a
/libLeapC.dll.a
)?