gpt4 book ai didi

c++ - 如何在cmake中使用宏?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:51 24 4
gpt4 key购买 nike

我正在尝试使用给定的宏来编译我的 C++ 程序?

MACRO(HEADER_DIRECTORIES return_list)
FILE(GLOB_RECURSE new_list *.h)
SET(dir_list "")
FOREACH(file_path ${new_list})
GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
SET(dir_list ${dir_list} ${dir_path})
ENDFOREACH()
LIST(REMOVE_DUPLICATES dir_list)
SET(${return_list} ${dir_list})
ENDMACRO()

有人能告诉我如何将参数传递给微型 ans 使用返回列表来包含目录吗?

最佳答案

您可以调用函数(或宏),就像在 C 中一样,使用它的名称。该名称由括号内的第一个字符串定义 - 因此您可以调用您的宏:

header_directories(...)

您的宏需要一个参数 - 一个变量 - 因此您的 CMakeLists.txt 将如下所示:

cmake_minimum_required(VERSION 3.13)


macro(header_directories return_list)

file(GLOB_RECURSE new_list *.h)
set(dir_list "")

foreach(file_path ${new_list})
get_filename_component(dir_path ${file_path} PATH)
set(dir_list ${dir_list} ${dir_path})
endforeach()

list(REMOVE_DUPLICATES dir_list)
set(${return_list} ${dir_list})

endmacro()


header_directories(foobar_list)
message(${foobar_list})

在如下所示的目录中

CMakeLists.txt
include/
foo.h

输出将如下所示:

$ cmake .
/.../directoryname/include
-- Configuring done
-- Generating done
-- Build files have been written to: /.../directoryname/

如果您现在想使用由您的宏生成的列表来包含这些目录,只需使用

include_directories(${foobar_list})

或者,甚至更好

target_include_directories(<target> <INTERFACE|PUBLIC|PRIVATE> ${foobar_list})

请注意,CMake 中的函数和宏不支持经典 返回值 - 在您可能习惯使用 C 的意义上。

中,您可以简单地创建一个新变量(或使用一个作为参数传递的变量 - 如上所述),在函数中,您可以使用 PARENT_SCOPE 关键字,用于将内容写入调用方传递的变量:

function(func result_variable)
set(${result_variable} "result" PARENT_SCOPE)
endfunction()

func(ret)
message(${ret})

关于c++ - 如何在cmake中使用宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54414206/

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