我在 下遇到链接器故障MinGW
,但是我不明白为什么。这是链接命令:
g++ -shared -mthreads -Wl,--out-implib,C:\Users\camm\Syren\libs\libSy_polyMesh.a -o C:\Users\camm\Syren\libs\Sy_polyMesh.dll 调试/Sy_polyMesh.o 调试/moc_Sy_polyMesh.o 调试/qrc_Sy_polyMesh.o -L"c:\Qt\4.8.4\lib" -lglu32 -lopengl32 -lgdi32 -luser32 -LC:\Users\camm\Syren/libs -lSyren -lglew32 -lboost_system -lQtSvgd4 -lQtSqld4 -lQtOpenGLd4 -lQtGuid4 -lQtCored4
undefined reference
错误来自Syren
dll(我应该声明该命令是由 自动生成的)qmake
。由于-LC:\Users\camm\Syren/libs
正斜杠和反斜杠的混合,看起来对我来说是畸形的,但如果我手动将它们设置为一种或另一种方式 - 它不会改变编译器输出。
我之前遇到了我需要的第 3 方库(特别是 GLEW 和 Boost)的问题,但因为它们相对“恒定”,所以我将它们放在我的C:\MinGW\lib
目录中没有问题。但这真的不是我的插件的选择。
我发现 MinGW文档在几个位置声明:
...因为可以始终使用 -L 选项指定合适的搜索路径。
...但是 GCC 本身通过提供适当的 -L 选项来提供有效的默认值。
然而,C:\Users\camm\Syren\libs
是Syren.dll
住哪里!
编辑: 这是我.pro
文件中的 LIBS 声明:
LIBS += -L$(SYREN_PATH)/libs \
-lSyren
win32 {
LIBS += -lglew32 \
-lboost_system
}
并$(SYREN_PATH)
扩展为C:\Users\camm\Syren
。我还可以看到 中的“缺失”符号Syren.dll
,例如:
C:\Users\camm\Documents\Syren\Sy_polyMesh_debug/../Sy_polyMesh/src/Sy_polyMesh.cpp:341:未定义对“Sy_GLBuffer::unbind()”的引用
可以看到列举如下:
6c500bd6 T _ZN11Sy_GLBuffer6unbindEv
编辑2
在向链接器阶段添加详细标志后,我注意到链接器正在遍历每个搜索路径,然后遍历每个库命名约定,并使用它可以打开的第一个。
attempt to open C:\Users\camm\Syren/libs/libSyren.dll.a failed
attempt to open C:\Users\camm\Syren/libs/Syren.dll.a failed
attempt to open C:\Users\camm\Syren/libs/libSyren.a succeeded
假设libSyren.a
可能被破坏,我将其重命名以强制链接器使用.dll
:
attempt to open C:\Users\camm\Syren/libs/libSyren.dll.a failed
attempt to open C:\Users\camm\Syren/libs/Syren.dll.a failed
attempt to open C:\Users\camm\Syren/libs/libSyren.a failed
attempt to open C:\Users\camm\Syren/libs/Syren.lib failed
attempt to open C:\Users\camm\Syren/libs/libSyren.dll failed
attempt to open C:\Users\camm\Syren/libs/Syren.dll succeeded
但我仍然收到完全相同的错误消息!