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
通常处理这个问题。
您也可以使用 otool
和 install_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
我在 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
通常处理这个问题。
您也可以使用 otool
和 install_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