是否有可能让CMake "导出一个环境变量",如LD_PRELOAD调用编译器/链接器之前,就像你可以在一个shell?
我在WSL2中使用旧的32位交叉编译器。源文件位于安装到WSL中的Windows文件系统上,其中inode是64位的,因此不受支持,编译器无法读取。
cc1plus: error: /mydir/.../source.cpp: Value too large for defined data type
我按照64位inode问题中的说明构建了inode64。因此,在shell中手动验证它与32位交叉编译器一起工作:
export LD_PRELOAD=/mydir/.../inode64.so
arm-fsl-linux-gnueabi-g++ source.cpp
我的问题是,因为我正在用CMake构建项目,我怎么能只调用32位编译器/链接器从CMake与
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()