c – 无法使用fixup_bundle()创建一个带Qt的可移植包
我已经在其他帖子上搜索了这个问题,但到目前为止还没有.所以我在这里.
我想创建一个可移植的包.便携式,如“我可以在任何OS X机器上运行它,即使我没有安装我需要的库(Qt)”.不幸的是,我无法弄清楚如何使用fixup_bundle()(这似乎是它的正确工具)来实现这一目标. 这是我最小的CMake生成的C项目: main.cpp中 #include <QString> #include <iostream> int main() { QString s("Hello,world!"); std::cout << s.toStdString() << std::endl; return 0; } 的CMakeLists.txt cmake_minimum_required(VERSION 2.8.11) project(test) # That part because I use a custom build of Qt. That's not the # relevant part (I guess?) FILE(GLOB QTROOTS path_to_qt/Qt-4.8.1/osx/bin/qmake) find_program(QT_QMAKE_EXECUTABLE NAMES qmake PATHS ${QTROOTS}) find_package(Qt4 COMPONENTS QtCore REQUIRED) include(${QT_USE_FILE}) add_executable(test MACOSX_BUNDLE main.cpp) target_link_libraries(test ${QT_LIBRARIES}) install(SCRIPT bundle.cmake) bundle.cmake INCLUDE(BundleUtilities) fixup_bundle(test.app "" "") 这是生成的test.app结构 test.app - Contents - Info.plist - Frameworks - QtCore.framework - Versions - 4 - QtCore - MacOS - test 所需的一切似乎都在捆绑中.一切顺利编译,运行良好,但是当我调用fixup_bundle时,这就是我得到的: vincent@hpcd0016-lion:tmp/test_bundle/ (0) > make install [100%] Built target test Install the project... -- Install configuration: "" -- fixup_bundle -- app='test.app' -- libs='' -- dirs='' -- fixup_bundle: preparing... -- fixup_bundle: copying... -- 1/4: *NOT* copying '/Users/vincent/tmp/test_bundle/test.app/Contents/MacOS/test' -- 2/4: copying 'path_to_qt/Qt-4.8.1/osx/lib//QtCore.framework/Versions/4/QtCore' -- fixup_bundle: fixing... -- 3/4: fixing up '/Users/vincent/tmp/test_bundle/test.app/Contents/MacOS/test' exe_dotapp_dir/='test.app/Contents/MacOS/' item_substring='/Users/vincent/t' resolved_embedded_item='/Users/vincent/tmp/test_bundle/test.app/Contents/MacOS/test' Install or copy the item into the bundle before calling fixup_bundle. Or maybe there's a typo or incorrect path in one of the args to fixup_bundle? CMake Error at /Applications/CMake 2.8-11.app/Contents/share/cmake-2.8/Modules/BundleUtilities.cmake:568 (message): cannot fixup an item that is not in the bundle... Call Stack (most recent call first): /Applications/CMake 2.8-11.app/Contents/share/cmake-2.8/Modules/BundleUtilities.cmake:656 (fixup_bundle_item) bundle.cmake:2 (fixup_bundle) cmake_install.cmake:31 (INCLUDE) make: *** [install] Error 1 有依赖路径(由otool -L给出): vincent@hpcd0016-lion:test.app/Contents/ (0) > otool -L test.app/Contents/MacOS/test test.app/Contents/MacOS/test: path_to_qt/Qt-4.8.1/osx/lib//QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0,current version 4.8.1) /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0,current version 56.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0,current version 169.3.0) vincent@hpcd0016-lion:tmp/test_bundle/ (0) > otool -L test.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore test.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore: path_to_qt/Qt-4.8.1/osx/lib//QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0,current version 4.8.1) /usr/lib/libz.1.dylib (compatibility version 1.0.0,current version 1.2.5) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0,current version 159.1.0) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0,current version 41.0.0) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0,current version 635.15.0) /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0,current version 55010.0.0) /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0,current version 52.0.0) /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0,current version 1094.0.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0,current version 53.0.0) 显然,fixup_bundle没有修复捆绑包,因为二进制文件仍然将其ID设置为我的机器路径. 在这个简单的例子中,我做错了什么? 解决方法
我在CMakeLists.txt的顶部添加了这一行
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}) 就是这样. 默认情况下,显然,CMAKE_INSTALL_PREFIX在我的机器上设置为/usr/local.如果将其更改为我当前的工作目录解决了问题,这意味着CMake正在尝试在/usr/local上执行某些操作(不允许这样做).那么为什么错误消息没有提到这样一个正确的访问错误? 我不知道我是否没有阅读足够的文档,或者文档是否需要一些精确的… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |