【发布时间】:2012-12-19 10:07:26
【问题描述】:
我在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 docs 状态在几个位置:
...因为可以始终使用 -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
但我仍然收到完全相同的错误消息!
【问题讨论】:
-
您使用的是哪个构建系统?编译器本身应该理解两者,但 shell 和 make 不理解。
-
您可以在项目文件中发布您的“LIBS”声明吗??
-
@JanHudec 我正在运行 Qt 的 MinGW,不涉及 cygwin。
-
@cmannett85:我什至没有想到 cygwin。我的意思不是它是手动编写的makefile还是cmake生成的还是qmake生成的,以及你是否有MSYS(这是mingw的unix shell;cygwin是不同的东西)
-
@JanHudec 这是
qmake-生成的。大概 Qt Creator 使用 MSYS 作为外壳,我从两者得到相同的输出。