使用 mingw32 获取“未定义的引用”,但使用 mingw64 没有链接器错误,为什么?

Getting 'undefined reference to' using mingw32, but no linker error using mingw64, why?

提问人:Hybridslinky 提问时间:12/18/2020 最后编辑:Hybridslinky 更新时间:9/1/2021 访问量:1899

问:

我正在尝试在cygwin上使用mingw编译LeapMotion API的示例

当我使用 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 文件的顺序,但我总是收到相同的错误。

链接器 mingw undefined-reference

评论

0赞 Brecht Sanders 12/19/2020
你有合适的 32 个库 (/) 吗?libLeapC.alibLeapC.dll.a
0赞 Hybridslinky 12/19/2020
在 /lib/x86 中只有 LeapC.lib 和 LeapC.dll,文件名与 /lib/x64 中的文件名相同
0赞 Brecht Sanders 12/19/2020
.lib 通常表示 MSVC。MinGW将.a用于静态库,将.dll.a用于共享库(以及.dll)。
0赞 Hybridslinky 12/19/2020
但是 64 位版本工作正常,文件名相同
0赞 Brecht Sanders 12/19/2020
你能检查DLL文件导出哪些符号(例如使用)吗?pexports

答:

0赞 Hybridslinky 12/19/2020 #1

我通过将 LeapC.lib 转换为 /lib/x86/ 中的 LeapC.a(并从文件夹中删除 LeapC.lib)解决了这个问题

gendef LeapC.dll //this generates LeapC.def
i686-w64-mingw32-dlltool.exe --def LeapC.def --dllname LeapC.dll --output-lib LeapC.a

评论

0赞 rubenvb 9/1/2021
请注意,通常不能链接由两个编译器生成的 C++ 代码。如果它有效,你很幸运,你没有使用这个或那个语言功能,或者没有遇到问题。链接器找到其符号这一事实并不意味着 ABI、异常处理,甚至标准库类型甚至分配器在代码的两个部分中都是相同的。