如何在CMake中调用LD_PRELOAD编译器



是否有可能让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_LAUNCHERenv 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()

最新更新