c++ - 如何使用 CMAKE 为交叉编译配置设置特定的 CMAKE_C_OUTPUT_EXTENSION?

标签 c++ build cmake cmake-modules

我正在尝试设置一个工具链文件,以便与 CMake 3.12.0 版本进行交叉编译。

我的对象文件的扩展名与 Windows 上的 .obj 和 UNIX 上的 .o 不同。

因此,我将我的 CMAKE_LANG_OUTPUT_EXTENSION 设置为 .src

不幸的是,此变量被 CMakeCInformation.cmake 文件中的这些行覆盖:

# some compilers use different extensions (e.g. sdcc uses .rel)
# so set the extension here first so it can be overridden by the compiler specific file
if(UNIX)
  set(CMAKE_C_OUTPUT_EXTENSION .o)
else()
  set(CMAKE_C_OUTPUT_EXTENSION .obj)
endif()

如果我注释掉这些行,我的配置就会起作用,并且会使用正确的对象扩展。

我认为我的工具链文件已配置,因此 CMake 不会执行其内部编译器检查。

这是我的工具链文件条目行的样子:

SET(CMAKE_SYSTEM_NAME Generic)

INCLUDE(CMakeForceCompiler)

SET(CMAKE_C_COMPILER_FORCED TRUE)
SET(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
#other compiler configuration lines here 
SET(CMAKE_C_OUTPUT_EXTENSION .src)
SET(CMAKE_ASM_OUTPUT_EXTENSION .o)
SET(CMAKE_C_OUTPUT_EXTENSION_REPLACE 1)
SET(CMAKE_ASM_OUTPUT_EXTENSION_REPLACE 1)

我知道 CMakeForceCompiler 已贬值,应该使用 CMAKE_TRY_COMPILE_TARGET_TYPE,这就是两者都存在的原因。

我正在使用 -DCMAKE_TOOLCHAIN_FILE 告诉 CMake 我的工具链文件

你能帮我弄清楚我做错了什么吗?

编辑:我还尝试CACHE CMAKE_C_OUTPUT_EXTENSION 的值。至少对我来说这没有用。

最佳答案

project 命令之后的 CMakeLists.txt 文件中添加 SET(CMAKE_C_OUTPUT_EXTENSION .src),而不是在工具链文件中。这应该让您获得所需的行为(因为它应该覆盖 CMakeCInformation 和任何其他模块脚本设置的值)。

工具链文件用于设置编译器所在位置的基本工具链信息和一些基本设置。其他变量之后需要通过自定义编译器或平台文件进行设置,这些文件可以通过 CMAKE_USER_MAKE_RULES_OVERRIDE 包含。

来自 CMake 问题 18713:“之前已报告过此问题,有人提到工具链文件不应该为更复杂的工具链设置此类内容。”

CMake 问题 398139 “工具链文件不应该设置这样的东西。...输出扩展名应该由编译器指定,或者在此处设置默认值后由 CMakeCInformation 加载的平台信息文件指定。”

关于c++ - 如何使用 CMAKE 为交叉编译配置设置特定的 CMAKE_C_OUTPUT_EXTENSION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51842952/

相关文章:

cmake - 使用 CMake 选项命令而不是设置的优点?

c++ - CMake 基本项目设置

C++ 错误 : Conversion to Non-Scalar Type

c++ - msgpack:在不知道类型的情况下解压自定义类

windows - Hadoop 2.2.0 Window 7 构建失败访问被拒绝

java - Gradle:为 Java 和 Android 构建不同的 jar

Xcode 如何从编译中排除文件夹?

c++ - cmake,使用/MD 和 find_package(Boost) 构建

c++ - 遍历标准映射并比较文本

c++ - 如果在 C++ 类中省略复制构造函数,会发生什么(确切地)?