首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用MacOS构建和分发CMake应用程序

使用MacOS构建和分发CMake应用程序
EN

Stack Overflow用户
提问于 2022-07-25 11:12:06
回答 1查看 174关注 0票数 0

我想这个问题已经问了很多次了,但我找不到适合我的解决办法。

我有一个用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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
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

然后运行以下命令:

代码语言:javascript
运行
复制
# 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-26 15:52:10

我只是觉得macdeployqt没有部署Qt总线框架。要解决这个问题,请显式地在CMake文件中添加依赖项。

因此,解决方案是使用我发布的代码,但将Qt::DBus链接到CMakeLists.txt

代码语言:javascript
运行
复制
...
find_package(Qt6 COMPONENTS ... DBus REQUIRED)
...
target_link_libraries(some_executable PRIVATE Qt6::DBus)

那一切都很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73108273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档