Qt mingw忽略'-L';旗帜
我在Qt mingw忽略'-L';旗帜,qt,gcc,mingw,qmake,Qt,Gcc,Mingw,Qmake,我在MinGW下遇到链接器故障,但我看不出原因。这是链接命令: g++-shared-mthreads -Wl,--out implib,C:\Users\camm\Syren\libs\libSy\u polyMesh.a-o C:\Users\camm\Syren\libs\Sy\u polyMesh.dll debug/Sy\u polyMesh.o debug/moc_Sy_polyMesh.o debug/qrc_Sy_polyMesh.o-L“c:\Qt\4.8.4\lib” -lg
MinGW
下遇到链接器故障,但我看不出原因。这是链接命令:
g++-shared-mthreads
-Wl,--out implib,C:\Users\camm\Syren\libs\libSy\u polyMesh.a-o C:\Users\camm\Syren\libs\Sy\u polyMesh.dll debug/Sy\u polyMesh.o
debug/moc_Sy_polyMesh.o debug/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
在我看来格式不正确,因为前斜杠和反斜杠混合在一起,但是如果我手动将它们全部设置为一种方式或另一种方式,则不会更改编译器输出
我以前在使用我需要的第三方库时遇到过问题(特别是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\u路径)
扩展为C:\Users\camm\SYREN
。我还可以查看Syren.dll
中的“缺失”符号,例如:
C:\Users\camm\Documents\Syren\Sy\u polyMesh\u debug/。/Sy\u polyMesh/src/Sy\u polyMesh.cpp:341:
对“Sy_GLBuffer::unbind()”的未定义引用
可被视为:
6c500bd6 T_ZN11Sy_GLBuffer6unbindEv
Edit2
在向链接器阶段添加详细标志后,我注意到链接器正在遍历每个搜索路径,然后遍历每个库命名约定,并使用它可以打开的第一个
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
但我仍然收到完全相同的错误消息 用
${SYREN\u PATH}
替换${SYREN\u PATH}
时会发生什么?
因为前面的符号$()
表示
请参阅如果您正在链接正确的DLL,并且链接器没有抱怨缺少文件,则DLL可能缺少允许链接的导出 如果正确导出符号,MinGW链接器可以直接链接到DLL,但仍建议链接到名为
lib*.a
或lib*.DLL.a
的导入库(应在qmake构建中创建)。我相信链接器会查找带有和不带lib
前缀的变体,但我不确定,应该自己测试
您可以使用
objdump
和/或nm
检查DLL导出的符号如果链接器没有抱怨无法加载Syren DLL
,则表示文件已正确加载。。。符号只是在Syren dll中丢失(未导出?)。。。为什么没有更多的信息就很难说
当您构建Syren库时,是否有任何关于缺少原型的警告?
Syren lib使用什么,没有不可移植或需要Windows dll的东西?
你能列出丢失的符号吗
编辑:如何编译Syren.dll
?你用Mingw了吗?您传递给编译器/链接器的选项是什么?
我建议阅读以下两个链接:
如果您导出C++函数,则必须在程序和DLL之间使用相同的编译器。或者可以使用C样式包装器函数来封装C++ abi。< /p>
关于这个主题的一篇非常好的文章:您正在使用哪个构建系统?编译器本身应该理解两者,但是shell和make不理解。你能在项目文件中发布你的“LIBS”声明吗?@JanHudec我正在运行Qt的MinGW,没有涉及cygwin。@cmannett85:我甚至没有想到cygwin。我的意思不是说它是手动编写的makefile,还是由cmake生成的,还是由qmake生成的,也不是说你是否有MSYS(这是unixshellformingw;cygwin是不同的东西)@JanHudec它是由qmake生成的。大概Qt Creator使用MSYS作为shell,我从两者获得了相同的输出。什么都没有,但是SYREN_PATH
是一个环境变量-这正是我想要的。我有lib*.a
变量和.dll
在同一个目录中,所以它不应该使用它吗?@cmannett85是的,那么你可能是。检查.a
和.dll
文件是否显示链接器找不到的符号。是的,我可以通过objdump
和nm
看到缺少的符号-我真的很难理解现在发生了什么…我已经为我的问题添加了更多细节,你能看到它是否暗示了你可能知道的任何其他东西吗?我相信DLL导出的函数将成为\uu imp\uu*original\u name*
,并且这些符号将需要与你找到的符号一起出现。对于Windows DLL,您需要使用dllimport/dllexport
机制才能使一切正常工作。似乎您正在静态地构建Syren。您是否检查了libSyren.a
中缺少的符号?我想您是对的,如果我将Syren.dll
和libSyren.a
文件复制到MinGW/lib
中,它仍然无法工作。我正在将这个应用程序从Linux移植到Windows上(像这样的东西在Linux上“很管用”),所以我有什么特别的选择吗