gpt4 book ai didi

cmake - 获取由命令 add_definitions() 和 add_compile_options() 设置的 C/CXX FLAGS

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

在我的 CMakeLists.txt 中,全局 C 和 CXX 标志是使用命令 add_definitions() 设置的和 add_compile_options .

多次尝试检索 C/CXX 标志:

  1. ${CMAKE_C_FLAGS}${CMAKE_CXX_FLAGS} 为空
  2. ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}} 是原始的默认 CMake 值
    (例如 -g 用于 CMAKE_C_FLAGS_DEBUG)
  3. ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}同上
  4. get_cmake_property(def COMPILE_DEFINITIONS)NOTFOUND
  5. get_cmake_property(opt COMPILE_OPTIONS) 也是 NOTFOUND

我想将我的自定义 C/CXX 标志传递给基于 ./configure 的外部项目:

ExternalProject_Add( my_external_lib
DEPENDS Threads::Threads
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}
BUILD_IN_SOURCE 1
UPDATE_COMMAND echo "Full clean" && make distclean
CONFIGURE_COMMAND ${CMAKE_CURRENT_LIST_DIR}/configure
--prefix=${CMAKE_BINARY_DIR}
--cc=${CMAKE_C_COMPILER}
--cxx=${CMAKE_CXX_COMPILER}
--CFLAGS=${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}
--CXXFLAGS=${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}
--LDFLAGS=${CMAKE_STATIC_LINKER_FLAGS_${CMAKE_BUILD_TYPE}}
--ARFLAGS=${CMAKE_STATIC_LINKER_FLAGS_${CMAKE_BUILD_TYPE}}
--enable-static
)

(1) 如何获取 add_definitions() 设置的编译标志和 add_compile_options ?

注意:我使用的是 CMake 版本 3.3.2


在写问题的时候,我意识到我在想另一个问题:

我使用 ccache./configure 脚本没有看到我的环境变量 CCCXX 当我这样设置它们:

get_cmake_property(launcher   RULE_LAUNCH_COMPILE)
set(ENV{CC} ${launcher} ${CMAKE_C_COMPILER})
set(ENV{CXX} ${launcher} ${CMAKE_CXX_COMPILER})

(2) 上述 CMake 语句是否正确?


糟糕,我又遇到了另一个问题:

我从同一个变量 ${CMAKE_STATIC_LINKER_FLAGS} 中检索了 LDFLAGSARFLAGS
(3) 是否有另一个CMake变量来设置ARFLAGS

最佳答案

一个帖子里有几个问题,但都很简单:

  1. add_definitions() 的文档链接明确引用了 directorytarget COMPILE_DEFINITION 属性。其中第一个是使用 get_directory_property() 提取的,第二个使用 get_target_property() .它们中的任何一个也可以通过使用 get_property() 来提取。 .您尝试使用的 get_cmake_property 在这里不适用(它用于其他类型的属性)。

  2. 您在配置 步设置了环境变量 CC 和 CXX,但是 ExternalProject_Add 的所有命令都在 构建 步执行。

目前ExternalProject_Add不支持简单设置环境变量。根据 this bugreport 中的建议,对于设置变量的值没有空格,您可以在命令前加上“VAR=VAL”子句。但是对于您的情况,由于转义问题,这将行不通。

另请参阅 CMake 常见问题解答:How can I get or set environment variables?

[...]
environment variables SET in the CMakeLists.txt only take effect for cmake itself (configure-time), so you cannot use this method to set an environment variable that a custom command might need (build-time). Barring environment variable support by various CMake commands (e.g. add_custom_command(), currently not supported yet), an acceptable workaround may be to invoke shell scripts instead which wrap the commands to be executed.

用于设置环境变量和运行实际命令的简单包装器脚本:

wrapper.sh.in:

export "CC=ccache @CMAKE_C_COMPILER@"
export "CXX=ccache @CMAKE_XX_COMPILER@"
eval "$*"

CMakeLists.txt:

configure_file(wrapper.sh.in wrapper.sh @ONLY)
ExternalProject_Add(my_external_lib
...
CONFIGURE_COMMAND /bin/sh ${CMAKE_CURRENT_BINARY_DIR}/wrapper.sh
${CMAKE_CURRENT_LIST_DIR}/configure ...
BUILD_COMMAND /bin/sh ${CMAKE_CURRENT_BINARY_DIR}/wrapper.sh make
)

请注意,您应该为每个需要此变量的命令使用包装器。在您的例子中,它们是 CONFIGURE_COMMAND 和 BUILD_COMMAND。

  1. Documentation对于 CMAKE_STATIC_LINKER_FLAGS 表示这些标志用于链接器,因此您可能将它们用作 LDFLAGS。至于ARFLAGS,它们被直接硬编码为CMAKE_C_ARCHIVE_CREATE。变量,包含 ar 的完整命令行。默认情况下,此命令仅使用链接器标志,因此您的方法似乎也是正确的。

关于cmake - 获取由命令 add_definitions() 和 add_compile_options() 设置的 C/CXX FLAGS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34754392/

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