-1

我在 下遇到链接器故障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错误来自Syrendll(我应该声明该命令是由 自动生成的)qmake。由于-LC:\Users\camm\Syren/libs正斜杠和反斜杠的混合,看起来对我来说是畸形的,但如果我手动将它们设置为一种或另一种方式 - 它不会改变编译器输出。

我之前遇到了我需要的第 3 方库(特别是 GLEW 和 Boost)的问题,但因为它们相对“恒定”,所以我将它们放在我的C:\MinGW\lib目录中没有问题。但这真的不是我的插件的选择。

我发现 MinGW文档在几个位置声明:

...因为可以始终使用 -L 选项指定合适的搜索路径。

...但是 GCC 本身通过提供适当的 -L 选项来提供有效的默认值。

然而,C:\Users\camm\Syren\libsSyren.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

但我仍然收到完全相同的错误消息!

4

3 回答 3

2

如果您正在链接正确的 DLL,并且链接器没有抱怨缺少文件,则 dll 可能缺少导出以允许链接。

lib*.a如果 MinGW 链接器正确导出符号,它可以直接链接到 DLL,尽管仍然建议链接到名为or的导入库(应该在 qmake 构建中创建)lib*.dll.a。我相信链接器会寻找带前缀和不带lib前缀的变体,但我不确定,应该自己测试一下。

您可以使用objdump和/或检查 DLL 导出的符号nm

于 2012-12-19T12:29:26.340 回答
1

如果链接器没有抱怨无法加载Syren dll,则意味着文件已正确加载......符号只是丢失到Syren dll(未导出?)......为什么如果没有更多信息就很难判断

当您构建 Syren 库时,您是否对缺少原型有任何警告?Syren lib 使用什么,没有什么不可移植或需要 Windows dll?你能给出缺失符号的列表吗?

编辑:你是如何编译的Syren.dll?你用的是明威吗?您将什么选项传递给编译器/链接器?我建议阅读这两个链接:

如果要导出 C++ 函数,则必须在程序和 DLL 之间使用相同的编译器。或者,您可以使用 C 风格的包装函数来封装 C++ ABI。

关于这个主题的一篇非常好的文章:http: //www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL

于 2012-12-19T12:49:15.197 回答
0

当你替换$(SYREN_PATH)为时会发生什么$${SYREN_PATH}?因为前一种表示法表示执行 Makefile 时环境变量$()的内容。

请参阅qmake 变量参考。

于 2012-12-19T10:50:56.003 回答