交叉编译Conan包遇CMake RPATH错误,求解决方案及相关疑问
交叉编译fmt依赖时CMake Ninja生成器的RPATH错误解决方法
解决方法:通过Conan注入CMake参数
由于无法直接修改fmt包的CMake调用命令,可通过以下两种Conan配置方式添加CMAKE_BUILD_WITH_INSTALL_RPATH=ON参数:
1. 修改目标平台Conan配置文件
在你的clanglinux配置文件的[conf]段添加:
tools.cmake.cmaketoolchain:cmake_variables=CMAKE_BUILD_WITH_INSTALL_RPATH=ON
该配置会让所有通过CMakeToolchain构建的依赖包自动带上此参数,包括fmt。
2. 在本地conanfile.py中针对fmt包单独设置
如果仅需给fmt包添加该参数,可在项目的conanfile.py中添加包级配置:
from conan import ConanFile from conan.tools.cmake import CMakeDeps, CMakeToolchain class App(ConanFile): name = "example_library" version = "1.0.0" settings = "os", "compiler", "build_type", "arch" requires = "fmt/9.0.0" default_options = {"fmt:shared": True} def configure(self): # 仅对fmt包注入CMake变量 self.conf.define("tools.cmake.cmaketoolchain:cmake_variables", {"CMAKE_BUILD_WITH_INSTALL_RPATH": "ON"}, package_id="fmt/*")
为什么必须设置CMAKE_BUILD_WITH_INSTALL_RPATH?
这个错误的核心原因:
- CMake默认会为共享库设置构建树RPATH(方便编译阶段测试),安装时再替换为安装树RPATH。
- 但Ninja生成器在非ELF/XCOFF平台(比如Windows主机交叉编译Linux ELF库)下,不支持安装时修改RPATH的重链接操作——Windows的PE格式与Linux的ELF格式对RPATH的处理逻辑差异极大,交叉编译环境下CMake无法在Windows中修改ELF库的RPATH。
设置CMAKE_BUILD_WITH_INSTALL_RPATH=ON后,CMake会直接在编译阶段使用安装树的RPATH,跳过安装时的重链接步骤,从而规避错误。
能否完全避免设置该变量?
几乎没有可行的替代方案,除非满足以下任一条件:
- 改用支持安装时重链接的生成器(如Makefiles),但你已指定使用Ninja,此路径不可行。
- 将fmt编译为静态库(修改
default_options = {"fmt:shared": False}),但静态库无需RPATH,不符合你使用共享库的需求。 - 找到fmt包的自定义选项禁用RPATH处理,但fmt的CMake配置默认会设置RPATH,无直接关闭的选项。
因此,通过Conan注入CMAKE_BUILD_WITH_INSTALL_RPATH=ON是最直接有效的解决方案。
内容的提问来源于stack exchange,提问作者mirkobraic
相关产品推荐
相关产品推荐

