gpt4 book ai didi

cmake - 在函数中设置 CMake 变量

转载 作者:行者123 更新时间:2023-12-05 04:12:30 24 4
gpt4 key购买 nike

我正在尝试编写一个 CMake 函数来创建 LLVM 位码文件的对象库。这是我目前所拥有的

function(build_llvm_lib OUTPUT SRC)
if(NOT LLVM_FOUND)
message(FATAL_ERROR "LLVM build requested but LLVM not found")
endif()

set(SRCS ${SRC} ${ARGN})

set(CMAKE_C_OUTPUT_EXTENSION ".bc")
set(CMAKE_CXX_OUTPUT_EXTENSION ".bc")
set(CMAKE_STATIC_LIBRARY_SUFFIX ".bc")

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -emit-llvm")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -emit-llvm")

set(CMAKE_C_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang)
set(CMAKE_CXX_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang++)
set(CMAKE_AR ${LLVM_TOOLS_BINARY_DIR}/llvm-ar)
set(CMAKE_RANLIB ${LLVM_TOOLS_BINARY_DIR}/llvm-ranlib)

add_library(${OUTPUT} OBJECT ${SRCS})
endfunction(build_llvm_lib)

但是,我遇到的问题是,即使我正在设置 CMake 变量,如 CMAKE_CXX_FLAGSCMAKE_CXX_OUTPUT_EXTENSION 这些似乎没有任何影响(即它们被忽略)当 CMake 运行时。当我查看生成的 Makefile 时,这些设置不会出现,当我运行 make 时,会构建一个常规目标文件而不是 LLVM 位码文件。

我是 CMake 的新手,有人可以解释一下这里发生了什么吗?我在这里对 CMake 函数有什么误解吗?

最佳答案

当您创建不同的目标时,虽然所有 CMake 变量可能具有不同的值,但 CMake 期望某些变量对于所有目标 都是相同的。这些变量的示例:

  • CMAKE_ _COMPILER

  • CMAKE_AR

  • CMAKE_RANLIB

  • CMAKE_ _OUTPUT_EXTENSION

这意味着您不能对同一项目中的不同目标使用不同的编译器。看,例如this question .

变量 CMAKE_ _FLAGS 也应该为所有目标全局定义。

只有传播到目标属性的 CMake 变量和函数才具有针对每个目标的意义

例如,您可以使用命令 add_compile_optionsadd_definitions 或通过手动设置目标的属性 为具体目标定义额外的编译器选项COMPILE_FLAGSCOMPILE_DEFINITIONS


在你的 build_llvm_lib 函数体中只有 CMAKE_STATIC_LIBRARY_SUFFIX 变量可能具有 per-target 性质:虽然它没有在 documentation 中声明, 我怀疑它只是设置 SUFFIX新定义目标的属性。

关于cmake - 在函数中设置 CMake 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40267771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com