Link macOs QT 项目中的dylib

Link dylib in macOs QT project

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

我阅读了网络以及此处的一些其他案例,但所有这些都是基于 paths.I 认为这不是路径问题。因为我做了所有更改,所以我阅读了所有案例,并将 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";
}

header

#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: 进程被强制结束。

/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,即 "/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

经过一番艰苦的调查,运行 发现这里给定的答案是错误的方向,我发现 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