C ++ CMake编译指令与?

h

我目前正在建立包含几个子项目(的(...)子项目)的大型项目。每个子项目都可以具有编译器指令。如果编译器指令位于子项目的最低级别,则将编译器指令传递到子项目上方最低级别的每个级别,最终导致很多项目。

第一个问题:这是一个好习惯吗?有哪些替代方案?

第二个问题:在顶层(即MyApp)传递编译器指令是一种好习惯吗?该应用程序将使用选项参数将成员传递给子项目的构造函数。

例如,我有一个带有子项目(网络)的应用程序(MyApp)。最低的子项目(网络)包含所有带有编译器指令IPV6的网络模块和方法最后,我有四个项目,称为:

  • 带网络的MyApp
  • 具有网络_IPV6的MyApp_IPV6

现在,我让您想象一下具有不同级别和不同编译器指令的多个子项目。

编辑:通过编译器指令我的意思是编译定义为:

#ifdef IPV6
// do stuff
#endif
纪尧姆·拉西科特(Guillaume Racicot)

在CMake中,您可以使用目标属性执行此操作:

add_executable(MyApp ...)
add_executable(MyApp_IPV6 ...)

add_subdirectory(network)

# consumes the public interface of network
target_link_libraries(MyApp PRIVATE network)

# consumes the public interface of network_IPV6
target_link_libraries(MyApp_IPV6 PRIVATE network_IPV6)

然后在里面的CMake文件中network/,添加目标及其编译定义:

add_library(network STATIC files...)
add_library(network_IPV6 STATIC files...)

# add IPV6 into its interface
target_compile_definitions(network_IPV6 PUBLIC IPV6)

因为目标network_IPV6将定义设置为IPV6,所以链接到该目标的任何人也将具有该定义。


另一个解决方案可能是仅通过配置一次构建所有内容,然后让用户决定是否要使用ipv6。

它将像这样工作:

option(MYAPP_USE_IPV6 "Compile MyApp with ipv6 support", OFF)
add_subdirectory(network)

# consumes the public interface of network
target_link_libraries(MyApp PRIVATE network)

然后,在网络目录中:

add_library(network STATIC files...)

if (MYAPP_USE_IPV6)
    # add IPV6 into its interface
    target_compile_definitions(network_IPV6 PUBLIC IPV6)
endif()

然后,您可以根据需要配置您的应用,或配置两个配置文件:

mkdir build
mkdir build-ipv6

cd build
cmake ..

cd ../build-ipv6
cmake .. -DMYAPP_USE_IPV6=ON

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C#中使用预编译器指令切换调试功能

来自分类Dev

当C#using指令不影响编译过程时,为什么将其称为“指令”?

来自分类Dev

在TravisCI下更改Cmake的C ++编译器

来自分类Dev

使用CMAKE编译CUDA C ++-指定了多个编译阶段

来自分类Dev

如何使用CMake使Python脚本编译和运行C ++程序

来自分类Dev

CMake C ++在编译时设置标头DEBUG变量?

来自分类Dev

在7条指令中将C编译为MIPS Assembly?

来自分类Dev

如何加快启用CMake的C ++项目的编译时间?

来自分类Dev

cmake无法编译为C ++ 11标准

来自分类Dev

告诉CMake对来自CMake的C文件使用C ++编译器?

来自分类Dev

使用'asm'指令编译C源代码

来自分类Dev

用CMake编译CU和C文件

来自分类Dev

交叉编译c / c ++ / cuda程序时尝试使用CMake

来自分类Dev

如何使用CMake将C ++编译为CUDA

来自分类Dev

使用CMake使用CUDA代码编译c ++

来自分类Dev

CMake和MinGW-“ C编译器无法编译简单的测试程序”

来自分类Dev

CMake:根据C宏定义有选择地重新编译C ++程序模块

来自分类Dev

c ++ 17的charconv是否具有cmake编译功能?

来自分类Dev

通过在实际的C / C ++源文件中包括预处理器构建指令的方式来编译C / C ++代码

来自分类Dev

为什么CMake会忽略编译器指令

来自分类Dev

如何使用cmake编译包含MPI的C程序

来自分类Dev

编译器无法在使用cmake配置的Visual Studio项目中执行C ++ 11指令

来自分类Dev

使用使用Boost / python.hpp的CMake编译c ++程序

来自分类Dev

Cmake错误:未知的CXX编译器标识,未知的C编译器标识

来自分类Dev

如何获取c源目录而不是cmake编译目录

来自分类Dev

无法使用CMake编译简单的Opencv C ++文件

来自分类Dev

来自 C++ 编译器的 CMake 语法高亮显示

来自分类Dev

使用 CLion、CMake 和 VS2017 编译器编译 C++17

来自分类Dev

在 Android 中链接使用 CMake 编译的 C 库的问题。

Related 相关文章

  1. 1

    在C#中使用预编译器指令切换调试功能

  2. 2

    当C#using指令不影响编译过程时,为什么将其称为“指令”?

  3. 3

    在TravisCI下更改Cmake的C ++编译器

  4. 4

    使用CMAKE编译CUDA C ++-指定了多个编译阶段

  5. 5

    如何使用CMake使Python脚本编译和运行C ++程序

  6. 6

    CMake C ++在编译时设置标头DEBUG变量?

  7. 7

    在7条指令中将C编译为MIPS Assembly?

  8. 8

    如何加快启用CMake的C ++项目的编译时间?

  9. 9

    cmake无法编译为C ++ 11标准

  10. 10

    告诉CMake对来自CMake的C文件使用C ++编译器?

  11. 11

    使用'asm'指令编译C源代码

  12. 12

    用CMake编译CU和C文件

  13. 13

    交叉编译c / c ++ / cuda程序时尝试使用CMake

  14. 14

    如何使用CMake将C ++编译为CUDA

  15. 15

    使用CMake使用CUDA代码编译c ++

  16. 16

    CMake和MinGW-“ C编译器无法编译简单的测试程序”

  17. 17

    CMake:根据C宏定义有选择地重新编译C ++程序模块

  18. 18

    c ++ 17的charconv是否具有cmake编译功能?

  19. 19

    通过在实际的C / C ++源文件中包括预处理器构建指令的方式来编译C / C ++代码

  20. 20

    为什么CMake会忽略编译器指令

  21. 21

    如何使用cmake编译包含MPI的C程序

  22. 22

    编译器无法在使用cmake配置的Visual Studio项目中执行C ++ 11指令

  23. 23

    使用使用Boost / python.hpp的CMake编译c ++程序

  24. 24

    Cmake错误:未知的CXX编译器标识,未知的C编译器标识

  25. 25

    如何获取c源目录而不是cmake编译目录

  26. 26

    无法使用CMake编译简单的Opencv C ++文件

  27. 27

    来自 C++ 编译器的 CMake 语法高亮显示

  28. 28

    使用 CLion、CMake 和 VS2017 编译器编译 C++17

  29. 29

    在 Android 中链接使用 CMake 编译的 C 库的问题。

热门标签

归档