是否可以像在 shell 中那样在调用编译器/链接器之前让 CMake“导出环境变量”(例如 LD_PRELOAD)?
我正在 WSL2 中构建多个项目,其中之一使用旧的 32 位交叉编译器。源文件位于挂载到 WSL 中的 Windows 文件系统上,其中 inode 是 64 位,因此不受支持,并且无法被 32 位编译器读取。
cc1plus: error: /mydir/.../source.cpp: Value too large for defined data type
我按照 64 位 inode 问题 的说明,构建了 inode64.so 并手动验证了它是否可以在 shell 中与 32 位交叉编译器一起使用:
export LD_PRELOAD=/mydir/.../inode64.so
arm-fsl-linux-gnueabi-g++ source.cpp
我的问题是,由于我正在使用 CMake 构建项目,我如何才能仅从 CMake 调用 32 位编译器/链接器
LD_PRELOAD=/mydir/.../inode64.so
在我的项目构建脚本中,我在调用 cmake 之前尝试导出 LD_PRELOAD,但它不起作用(因为 32 位 .so 不适用于本机 64 位 cmake 工具?)
cmake ./
export LD_PRELOAD=/mydir/.../inode64.so
make install
ERROR: ld.so: object '/mydir/.../inode64.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
将变量
CMAKE_CXX_COMPILER_LAUNCHER
设置为 env LD_PRELOAD=whatever.so
。 这将使用 env
命令来启动编译器。
该变量用于初始化目标属性,3.25 版本支持生成器表达式,因此如果您在同一构建中使用多个编译器,则可以将 env 命令包装在编译器版本或编译器名称的测试中。
如果您在特定配置中使用此编译器进行所有 C++ 构建,只需有条件地设置变量:
if(MY_CROSS_COMPILING_32_BIT)
set(CMAKE_CXX_COMPILER_LAUNCHER env LD_PRELOAD=whatever.so)
endif()