gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:35:04 24 4
gpt4 key购买 nike

我有一个使用 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 平台上编译我的项目。App编译并生成可执行文件。但是我在 MyLib 的链接器中出错。例如:

error : undefined reference to `__imp__ZN13FBSFBaseModelC2Ev'

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

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

在 Windows 和 Mingw 上我试过没有 GCC:QMAKE_LFLAGS += -r 动态获取 undefined reference 。

我尝试使用“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

最佳答案

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

无论如何。在 Linux 上,它与 -rdynamics 一起工作,因为 Linux 的 ELF 格式可以支持 undefined symbol 。

在 Windows 上,您必须向链接器提供有关在哪里可以找到符号的提示。所以你永远不会有 -rdynamics 选项。您要做的是提供一个 .lib 文件,该文件描述了哪些符号将在 exe 文件中可用。

这就是 WIN32:LIBS += $$PWD/lib/MyApp.lib 使其适用于 MSVC 的原因。

但是,MinGW 不识别.lib 文件,而是使用.a 文件。因此,您需要将 $$PWD/lib/MyApp.lib 替换为 $$PWD/lib/MyApp.a

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

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

关于c++ - 生成使用来自应用程序的符号的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56794393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com