Получение «неопределенной ссылки» с использованием mingw32, но отсутствие ошибки компоновщика с использованием mingw64, почему?

Я пытаюсь скомпилировать примеры для 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, но всегда получаю одну и ту же ошибку.

У вас есть нужные 32 библиотеки (libLeapC.a/libLeapC.dll.a)?

Brecht Sanders 18.12.2020 19:50

в /lib/x86 есть только LeapC.lib и LeapC.dll, те же имена файлов, что и в /lib/x64

Hybridslinky 18.12.2020 23:52

.lib обычно означает MSVC. MinGW использует .a для статических библиотек и .dll.a для общих библиотек (вместе с .dll).

Brecht Sanders 19.12.2020 14:16

но 64-битная версия работает нормально, и имена файлов такие же

Hybridslinky 19.12.2020 15:05

Вы можете проверить, какие символы экспортирует файл DLL (например, с помощью pexports)?

Brecht Sanders 19.12.2020 15:28

Я только что нашел различия из-за искажения имен, например. LeapCloseConnection (64-битный) и _LeapCloseConnection@4 (32-битный), в противном случае они экспортируют точно такие же символы. В любом случае, я решил проблему, как описано в моем ответе ниже.

Hybridslinky 20.12.2020 23:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
6
1 466
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему, преобразовав 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, обработка исключений и даже стандартные библиотечные типы или даже распределитель в этих двух частях кода одинаковы.

rubenvb 01.09.2021 12:23

Другие вопросы по теме