首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ CMake编译指令与?

C++ CMake编译指令与?
EN

Stack Overflow用户
提问于 2020-01-31 14:42:44
回答 1查看 129关注 0票数 2

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

第一个问题:是一个很好的实践吗?有什么可供选择的?

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

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

network

  • MyApp_IPV6
  • MyApp与network_IPV6

现在,我让您想象几个不同级别的子项目和不同的编译器指令.

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

代码语言:javascript
运行
复制
#ifdef IPV6
// do stuff
#endif
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-31 15:00:59

在CMake中,您可以使用目标属性来实现这一点:

代码语言:javascript
运行
复制
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文件中添加目标及其编译定义:

代码语言:javascript
运行
复制
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。

它的作用是这样的:

代码语言:javascript
运行
复制
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)

然后,在网络目录中:

代码语言:javascript
运行
复制
add_library(network STATIC files...)

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

然后根据需要配置应用程序,或者配置这两个配置文件:

代码语言:javascript
运行
复制
mkdir build
mkdir build-ipv6

cd build
cmake ..

cd ../build-ipv6
cmake .. -DMYAPP_USE_IPV6=ON
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60006033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档