如何在CMake中使用LD_PRELOAD调用编译器

问题描述 投票:0回答:1

是否可以像在 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 makefile windows-subsystem-for-linux ld-preload
1个回答
2
投票

将变量

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()
© www.soinside.com 2019 - 2024. All rights reserved.