C++ C++;CMake编译指令与?

C++ C++;CMake编译指令与?,c++,cmake,architecture,C++,Cmake,Architecture,我目前正在构建包含多个子项目的大型项目。每个子项目都可以有编译器指令。如果编译器指令位于子项目的最低级别,那么编译器指令将传递到子项目的最低级别之上的每个级别,最终会导致大量项目 第一个问题:这是一种好的做法吗?可能的替代方案是什么 第二个问题:在顶层(即MyApp)传递编译器指令是一个好的做法吗?应用程序将有成员通过选项参数传递给子项目的构造函数 例如,我有一个带有子项目(网络)的应用程序(MyApp)。最低的子项目(网络)包含所有具有编译器指令IPV6的网络模块和方法。最后,我有四个项目叫做

我目前正在构建包含多个子项目的大型项目。每个子项目都可以有编译器指令。如果编译器指令位于子项目的最低级别,那么编译器指令将传递到子项目的最低级别之上的每个级别,最终会导致大量项目

第一个问题:这是一种好的做法吗?可能的替代方案是什么

第二个问题:在顶层(即MyApp)传递编译器指令是一个好的做法吗?应用程序将有成员通过选项参数传递给子项目的构造函数

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

  • MyApp与网络
  • MyApp_IPV6与网络_IPV6
现在我让你想象一下,在不同的级别上有几个子项目和不同的编译器指令

编辑: 我所说的编译器指令是指编译定义:

#ifdef IPV6
// do stuff
#endif

在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文件中,添加目标及其编译定义:

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

# add IPV6 into its interface
target_compile_definitions(network_IPV6 PUBLIC IPV6)
由于目标
network\u 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

你所说的“编译器指令”是什么意思?我指的是编译定义来为某些项目构建一些代码行谢谢你的完整答案。以你的例子来说,我的IDE仍然拥有和编译定义一样多的库和/或EXE?我不确定你的意思。如果您的IDE显示编译器定义列表,它会显示吗?在第一个示例中,您有四个目标,通常IDE将显示这四个目标。对于第二个示例,IDE将只显示两个目标,但将显示项目的两个可用配置。这就是VSCode、VS和KDevelop的工作方式。我还没有使用足够的其他IDE来说明。