首页 > 解决方案 > 生成使用来自应用程序的符号的库

问题描述

我有一个使用 QtCreator (QT5.13) 构建的应用程序,它由一个应用程序 MyApp 组成,假设是一个动态库 MyLib。此动态库还调用应用程序中定义的函数。

1) 使用正确的 INCLUDEPATH 和头文件,我的项目使用 MSVC 在 Windows 平台上编译和执行。

2) 我在 unix Ubuntu (QT5.13) 上移植项目也成功,但对 .PRO 进行了少量修改,基本上添加了“-r dynamic”并删除了直接引用“ LIBS += $$PWD/lib/MyApp.lib "

3)现在我去用Mingw(mingw730_64)在windows平台上编译我的项目。应用程序编译并生成可执行文件。但是我的 MyLib 的链接器出错了。例如 :

错误:未定义对“__imp__ZN13FBSFBaseModelC2Ev”的引用

以及 MyLib 调用的 MyApp 中存在的所有符号。

我显然不了解与平台的链接过程以及编译器如何管理静态或动态解析符号。谢谢您的帮助

在 Windows 和 Mingw 上,我尝试不使用 GCC:QMAKE_LFLAGS += -r dynamic 获取未定义的引用。

我尝试使用“ GCC:QMAKE_LFLAGS += -r dynamic ”,但 winGW 似乎无法识别

适用于 windows / MVSC 的 MyApp.PRO:

    TARGET    =    MyApp
    TEMPLATE    =    app
    LIBS    +=    -L$$PWD/lib    -lOtherLib
    GCC:QMAKE_LFLAGS += -r dynamic

适用于 linux 和 GCC 的 MyLib.PRO 有效:

    TARGET    =    MyLib
    TEMPLATE    =    lib
    WIN32:LIBS    +=    $$PWD/lib/MyApp.lib

标签: c++qtlinkermingw

解决方案


如评论中所述,拥有一个需要 exe 文件中的符号的库是落后的。

反正。在 Linux 上它可以使用,-rdynamics因为 Linux 的 ELF 格式可以支持未定义的符号。

在 Windows 上,您必须向链接器提供有关在何处查找符号的提示。所以你永远没有-rdynamics选择。您要做的是提供一个.lib文件,该文件描述 exe 文件中可用的符号。

这就是为什么WIN32:LIBS += $$PWD/lib/MyApp.lib它适用于 MSVC。

但是,MinGW 不识别.lib文件,而是使用.a文件。所以你需要替换$$PWD/lib/MyApp.lib$$PWD/lib/MyApp.a.

MyApp.a请注意,如果您在编译时没有生成MyApp.exe,则可能意味着两件事:

  1. 您需要添加-Wl,--out-implib=MyApp.a到您的 exe 的链接命令。
  2. 您需要__declspec(dllexport)在应用代码中标记导出的符号。

推荐阅读