生成使用来自应用程序的符号的库

时间:2019-06-27 15:29:57

标签: c++ qt linker mingw

我有一个使用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动态 获取未定义的引用。

我尝试使用“ GCC:QMAKE_LFLAGS + = -r动态”,但似乎未被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

1 个答案:

答案 0 :(得分:0)

如评论中所述,拥有一个需要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)标记导出的符号。