当我正在使用 CrashReporter 在我的CMake项目中调用的第三方macOS框架,如果我将可执行文件复制到另一台计算机,它会显示找不到该库如下所示:```cmake_minimum_required(VERSION 3.15)
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X deployment version")
project(bug CXX)
find_package(CrashReporter REQUIRED)
add_executable(bug "${CMAKE_CURRENT_SOURCE_DIR}/main.mm" )
set_target_properties(bug PROPERTIES LINK_FLAGS "-ObjC") target_link_libraries(bug PUBLIC "-framework AppKit")
target_link_libraries(bug PRIVATE ${CRASHREPORTER_FRAMEWORK})
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
当你在CMake项目中遇到将可执行文件复制到另一台计算机时找不到第三方库的问题,这通常是因为动态链接库(在这个案例中是CrashReporter
框架)没有被正确地打包或部署到目标计算机上。为了解决这个问题,你可以采取以下几个步骤:
确认库路径:确保find_package(CrashReporter REQUIRED)
能够正确找到CrashReporter
框架。如果这个框架不是标准安装的一部分,你可能需要自定义FindCrashReporter.cmake
模块来指导CMake如何查找它。
使用RPATH:为了使可执行文件能够在不同位置运行时找到其依赖的库,可以设置RPATH。在CMake中,可以通过以下方式设置RPATH:
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_MACOSX_RPATH TRUE)
这样设置后,CMake会在构建过程中将可执行文件的RPATH设置为指定路径,使得即使移动到其他位置也能找到依赖库。
打包应用与依赖:当准备将应用分发到其他计算机时,考虑使用像install
命令和CPack来创建一个包,该包包含你的可执行文件以及所有必要的动态库。例如:
install(TARGETS bug DESTINATION bin)
install(DIRECTORY ${CRASHREPORTER_FRAMEWORK_DIR} DESTINATION lib)
include(InstallRequiredSystemLibraries)
set(CPACK_GENERATOR "DragNDrop") # 选择合适的打包格式
set(CPACK_PACKAGE_NAME "MyApp")
set(CPACK_PACKAGE_FILE_NAME "MyApp-1.0.0")
include(CPack)
这段代码会安装你的可执行文件到bin
目录,并且如果CrashReporter
是一个文件系统上的库,也会将其安装到lib
目录下。然后通过CPack生成一个安装包,便于在其他机器上部署。
检查部署目标兼容性:你已经设置了CMAKE_OSX_DEPLOYMENT_TARGET
,确保这个版本与目标计算机的macOS版本兼容。
手动复制依赖:作为最后的手段,如果你不打算使用CPack或者上述方法不适用,你也可以手动将CrashReporter
框架复制到可执行文件所在目录或系统的库目录中(如/Library/Frameworks
或~/Library/Frameworks
),但这通常不是推荐的做法,因为管理起来比较繁琐且容易出错。
通过以上步骤,你应该能够解决在不同计算机上因找不到第三方库而导致的运行时错误。