我想这个问题已经问了很多次了,但我找不到适合我的解决办法。
我有一个用C++编写的桌面应用程序的C++项目,它使用一些库(Qt和OpenCV)。我在Windows下开发了这个项目,但我想为MacOS构建它。为此,我使用brew安装了必要的库,并使用find_package
cmake命令在我的项目中使用它们。
一切都很好,但我的问题是我无法在另一台MacOS计算机上成功地运行我的项目,因为缺少库(.dylib)。
在Windows上,我使用windeployqt
,然后手工将剩余的opencv复制到可执行文件夹中,这是可行的。在MacOS上,据我了解,情况并非如此,您必须使用install_name_tool
来编辑具有正确路径的可执行文件。
我尝试使用macdeployqt
,直接将所有必需的库复制到应用程序包(*.app
文件夹)中,并编辑可执行库路径。
我遇到的一个问题是,复制到包中的OpenCV库被链接到已安装的系统库。为了解决这个问题,我编写了一个在每个install_name_tool
库上运行OpenCV的脚本,这解决了这个问题,但我不确定这是最好的方法。
不幸的是,我还有一个无法解决的问题:macdeployqt
没有部署所有必要的框架,而且由于某种原因,Qt QDBus框架缺失了。
也许我走错路了?我以前从未使用过MacOS,我不确定这是构建桌面应用程序的正确方法。有什么示例项目我可以用作参考吗?
附注:我不使用XCode,我只是使用cmake工具在终端中构建我的项目。
编辑
这是我使用的一个示例项目。
CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(example LANGUAGES CXX)
# find libraries
find_package(OpenCV REQUIRED)
find_package(Qt6 COMPONENTS Widgets Gui OpenGL OpenGLWidgets Multimedia MultimediaWidgets PrintSupport Charts REQUIRED)
add_executable(some_executable)
target_sources(some_executable PRIVATE "main.cpp")
# tel CMake to create a bundle
# see https://doc.qt.io/qt-6/macos-deployment.html
set_target_properties(some_executable PROPERTIES MACOSX_BUNDLE TRUE)
# link libraries
# some opencv libs I use
target_link_libraries(some_executable PRIVATE opencv_core opencv_xfeatures2d opencv_videoio opencv_highgui opencv_video)
# some Qt libs I use
target_link_libraries(some_executable PRIVATE Qt6::Widgets Qt6::Multimedia Qt6::MultimediaWidgets Qt6::PrintSupport Qt6::Charts)
main.cpp
#include <QApplication>
#include <QLabel>
int main(int argc, char** argv) {
QApplication app(argc, argv);
QLabel hello;
hello.setText("Hello There!");
hello.show();
return app.exec();
}
deploy.sh
echo Deploying MacOS bundle...
# use this to see the linked libraries
# otool -l some_executable.app/Contents/MacOS/some_executable
# use macreployqt to deploy the necessary libraries and frameworks
macdeployqt some_executable.app
FRAMEWORKS_PATH=some_executable.app/Contents/Frameworks
# wrong: OPENCV_LIB_PATH=/usr/local/Cellar/opencv/4.5.5_2/lib
OPENCV_LIB_PATH=@rpath
OPENCV_VER=405 # <- change this to match the opecv version
echo editing opencv paths...
OPENCV_LIBS=(
"libopencv_calib3d"
"libopencv_core"
"libopencv_dnn"
"libopencv_features2d"
"libopencv_flann"
"libopencv_highgui"
"libopencv_imgcodecs"
"libopencv_imgproc"
"libopencv_ml"
"libopencv_shape"
"libopencv_video"
"libopencv_videoio"
"libopencv_xfeatures2d"
)
replace_opencv_lib_path() {
# the library to patch
LIB=$1
# the linked library
TO_REPLACE=$2
install_name_tool -change ${OPENCV_LIB_PATH}/${TO_REPLACE}.${OPENCV_VER}.dylib @executable_path/../Frameworks/${TO_REPLACE}.${OPENCV_VER}.dylib $FRAMEWORKS_PATH/$LIB.${OPENCV_VER}.dylib
}
for lib in ${OPENCV_LIBS[@]}; do
for lib2 in ${OPENCV_LIBS[@]}; do
replace_opencv_lib_path $lib $lib2
done
done
然后运行以下命令:
# configure the project
cmake .
# build the project
cmake --build .
# deploy
sudo /bin/sh deploy.sh
# create a DMG file we can test on another computer
sudo macdeployqt some_executable.app -dmg
发布于 2022-07-26 15:52:10
我只是觉得macdeployqt
没有部署Qt总线框架。要解决这个问题,请显式地在CMake文件中添加依赖项。
因此,解决方案是使用我发布的代码,但将Qt::DBus
链接到CMakeLists.txt
中
...
find_package(Qt6 COMPONENTS ... DBus REQUIRED)
...
target_link_libraries(some_executable PRIVATE Qt6::DBus)
那一切都很好。
https://stackoverflow.com/questions/73108273
复制相似问题