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上“很管用”),所以我有什么特别的选择吗