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

标签 cmake makefile windows-subsystem-for-linux wsl-2 ld-preload

是否可以在调用编译器/链接器之前让 CMake“导出环境变量”(例如 LD_PRELOAD),就像在 shell 中一样?

我在 WSL2 中使用旧的 32 位交叉编译器。源文件位于挂载到 WSL 中的 Windows 文件系统上,其中 inode 是 64 位,因此不支持且无法被编译器读取。

cc1plus: error: /mydir/.../source.cpp: Value too large for defined data type

我按照 The 64 bit inode problem 的指示进行操作,并构建了 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 不适用于 native 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()

关于cmake - 如何在 CMake 中使用 LD_PRELOAD 调用编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74749894/

相关文章:

windows-10 - 安装WSL2和apache2后无法访问该站点

c++ - 麻省理工学院球体模拟设置中的 Matlab 错误

bash - makefile 中的多行 bash 命令

makefile - 是否弃用 : LDLIBS,?

linux - 如何在 WSL 中添加自定义起始目录

python - 脚本是否可以打开 WSL bash shell 并向其发送命令?

c++ - 无法完成构建 cgal sln

shell - CMake COMMAND shell 参数替换失败

python - 如何强制 CMake 在特定目录中查找库?

c++ - (makefile 错误)RTNETLINK 回答 : File exists