我目前正在构建包含几个子项目(子项目(.))的大型项目。每个子项目都可以有编译器指令。如果编译器指令位于子项目的最低级别,则编译器指令将在最低级别传递到子项目之上的每个级别,最终导致大量项目。
第一个问题:是一个很好的实践吗?有什么可供选择的?
第二个问题:是在顶层(即MyApp)上传递编译器指令的好方法吗?应用程序将成员传递给具有选项参数的子项目的构造函数.
例如,我有一个带有子项目(网络)的应用程序(MyApp)。最低子项目(网络)包含所有具有编译器指令IPV6的网络模块和方法。最后,我有四个项目叫做:
network
现在,我让您想象几个不同级别的子项目和不同的编译器指令.
编辑:编译器指令--我指的是编译定义:
#ifdef IPV6
// do stuff
#endif
发布于 2020-01-31 15:00:59
在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_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
https://stackoverflow.com/questions/60006033
复制相似问题