【问题标题】:Link dylib in macOs QT project在 macOS QT 项目中链接 dylib
【发布时间】:2019-07-10 22:06:03
【问题描述】:

我在 macOS 中尝试了一个简单的 dylib 并用 g++ 编译。我做了一个小样本来测试这个库,它工作得很好。 现在我制作了一个简单的 QT 应用程序,链接了 lib 并将标头添加到 mainwindow.cpp,但我总是收到一条失败消息原因:找不到图像

我在这里阅读了网络和其他一些案例,但都是基于路径。我认为这不是路径问题。因为我在所有情况下都进行了所有更改,并将 lib 复制到所有需要的文件夹中,例如项目文件夹、构建文件夹。没有任何帮助。

我认为 QT 无法与该库一起使用,并且我错过了一些需要的代码,例如用于初始化或导出的代码。所以问题更多在 dylib 内部,而不是在 QT 或 Paths 值中。

也许有人可以帮助我吗?

我试过了:

INCLUDEPATH += $$PWD/mylib
DEPENDPATH += $$PWD/mylib
macx: LIBS += -L$$PWD/mylib/ -lmylib

我尝试将 lib 复制到构建文件夹以及可执行文件夹。

还编辑:

/⁨Users⁩/⁨ingoforster⁩/Documents⁩/Development⁩/Playground⁩/TestGround⁩/mylib:/Users/ingoforster/Qt/5.9.1/clang_64/lib 
in Project settings DYLD_LIBRARY_PATH 
Set also to DYLD_FRAMEWORK_PATH

Cpp

#include "mylib.hpp"

char *mMessage(void) {
    return "Ein sonniger Tag";
}

标题

#include <stdio.h>
#include <iostream>

using namespace std;

char *mMessage(void);

编译 g++ -std=c++0x --verbose -dynamiclib -o libmylib.dylib mylib.cpp

样本

#include "mylib.hpp"

int main(void){

    char* Ingo = mMessage();
    std::cout << mMessage();

}

编译 g++ -std=c++0x test.cpp -L./ -lmylib

实际结果是样本运行良好。 但在 QT 中我得到了:

dyld:库未加载:libmylib.dylib 引用自:/Users/ingoforster/Documents/Development/Playground/build-TestGround-Desktop_Qt_5_9_1_clang_64bit-Debug/TestGround.app/Contents/MacOS/TestGround 原因:找不到图片 10:09:05:程序意外结束。 10:09:05:进程被强行结束。

【问题讨论】:

    标签: c++ macos qt g++ dylib


    【解决方案1】:

    /Users/ingoforster/Documents/Development/Playground/build-TestGround-Desktop_Qt_5_9_1_clang_64bit-Debug/TestGround.app/Contents/MacOS/TestGround 似乎已编译链接到您的库代码,但可能尚未正式安装到可执行文件中。 macdeployqt 通常处理这个问题。 您也可以使用 otoolinstall_name_tool 手动执行此操作:

    otool -L /path/to/executable

    这将列出正在使用的 dylib 的已安装路径。你会看到你的dylib,也就是“/old/path/to/libmylib.dylib”

    install_name_tool -change /old/path/to/libmylib.dylib /new/path/to/libmylib.dylib /path/to/executable

    通常,在.app 中,dylib 安装到.app 文件夹内的子目录中。

    Application.app/
        Contents/
            MacOS/
                executable
            Frameworks/
                libmylib.dylib
    

    使用install_name_tool,您可以指向相对于可执行路径的dylib,以使应用程序可移植。 install_name_tool -change /old/path/to/libmylib.dylib @executable_path/../Frameworks/libmylib.dylib /path/to/executable

    【讨论】:

    • 我看到了。这是老路吗? @rpath/libmylib.dylib(兼容版本0.0.0,当前版本0.0.0)
    • 是的。可以保留。然后,您需要使用install_name_tool -add_rpath 等添加正确的rpath。您还可以使用otool -l /path/to/executable 查看可执行文件的加载命令,以查看已经指定了哪些rpath,
    • 但是 /path/to/executable 是什么?这是通往 TesGround.app 的路径吗?
    • 在这种情况下它是/Users/ingoforster/Documents/Development/Playground/build-TestGround-Desktop_Qt_5_9_1_clang_64bit-Debug/TestGround.app/Contents/MacOS/TestGround 通常.app 主程序可执行文件将在Whatever.app/Contents/MacOS/ 中(见上图)。一旦有了正确的安装名称,请务必使用相同的工具解析依赖库的任何子依赖项。
    • 这些解决方案都不起作用。该应用程序仍然显示“找不到图像”。我也看不到应用程序的结构(框架)
    【解决方案2】:

    经过一番艰苦的调查,我发现这里给出的答案走错了方向,QTCreator 会自己做:

    QTCreator Pro 文件必须包含:

    macx: LIBS += -L$$PWD/mylib/ -lmylib
    INCLUDEPATH += $$PWD/mylib
    DEPENDPATH += $$PWD/mylib
    
    MediaFiles.files += mylib/libmylib.dylib
    MediaFiles.path = Contents/MacOS
    QMAKE_BUNDLE_DATA += MediaFiles
    

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 2015-06-27
      • 2022-11-07
      • 2020-05-13
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      相关资源
      最近更新 更多