我目前正在建立包含几个子项目(的(...)子项目)的大型项目。每个子项目都可以具有编译器指令。如果编译器指令位于子项目的最低级别,则将编译器指令传递到子项目上方最低级别的每个级别,最终导致很多项目。
第一个问题:这是一个好习惯吗?有哪些替代方案?
第二个问题:在顶层(即MyApp)传递编译器指令是一种好习惯吗?该应用程序将使用选项参数将成员传递给子项目的构造函数。
例如,我有一个带有子项目(网络)的应用程序(MyApp)。最低的子项目(网络)包含所有带有编译器指令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文件中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] 删除。
我来说两句