我有一个使用QtCreator(QT5.13)构建的应用程序,其中包含一个应用程序MyApp,并假设一个动态库MyLib。该动态库还调用应用程序中定义的函数。
1)使用正确的INCLUDEPATH和头文件,我的项目使用MSVC在Windows平台上编译并执行。
2)我也成功地在Unix Ubuntu(QT5.13)上移植了该项目,但对.PRO进行了少量修改,基本上添加了“ -r dynamic”并删除了直接引用“ LIBS + = $$ PWD / lib / MyApp.lib ”
3)现在,我去了在Windows平台上用Mingw(mingw730_64)编译我的项目。该应用程序将编译并生成可执行文件。但是我的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
如评论中所述,具有需要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
,则可能意味着两件事:
-Wl,--out-implib=MyApp.a
到exe的链接命令。__declspec(dllexport)
在应用程序代码中标记带有的导出符号。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句