【问题标题】:CMake - Different Include Directories For Different Targets?CMake - 不同目标的不同包含目录?
【发布时间】:2014-01-05 18:13:05
【问题描述】:

我正在使用 CMake 在 Linux 中开发一个 C++ 项目。

我正在创建两个库,LibALibB。我不希望 LibALibB 拥有相同的包含目录。有什么办法可以只设置LibA 以包含DirectoryA 并只设置LibB 以包含DirectoryB

编辑:

LibALibB 都将在可执行文件 MyExe 中使用。当我在 MyExe 的源代码中 #include LibA.hLibB.h 时,我不能让 DirectoryADirectoryB 中包含的头文件同时存在于 MyExe 中,因为这会产生命名空间冲突。

这可能吗?

编辑 2:这是我的 CMakeLists.txt include_directories(包含)

add_library(LibA src/LibA.cpp include/LibA.h)
set_property(TARGET LibA PROPERTY INCLUDE_DIRECTORIES /opt/SomeLibrary2.0/include/)
target_link_libraries(LibA /opt/SomeLibrary2.0/lib/a.so /opt/SomeLibrary2.0/lib/b.so /opt/SomeLibrary2.0/lib/c.so)

add_library(LibB src/LibB.cpp include/LibB.h)
set_property(TARGET LibB PROPERTY INCLUDE_DIRECTORIES ${LIB_B_INCLUDE_DIRS})
target_link_libraries(LibB ${LIB_B_LIBRARIES})

add_executable(MyExe src/myexe.cpp)
target_link_libraries(MyExe LibA LibB)

但我仍然遇到错误。 LibA.h 说 SomeLibrary 的头文件找不到?

【问题讨论】:

  • 拆分 CMake 文件,创建子目录。
  • 感谢您的评论。我的原始问题已更新,以更好地反映我的问题。
  • I cannot have the included header files from DirectoryA and DirectoryB coexisting in MyExe, as this will create namespace conflicts 恕我直言,这是设计问题,如果您解决包含冲突,您可能会遇到奇怪的链接器错误和意外的运行时行为

标签: c++ linux cmake


【解决方案1】:

如果您可以将 CMake 版本 2.8.12 指定为最低版本,则可以使用target_include_directories。这是在 2.8.11 版本中引入的,但我认为它在 2.8.12 之前有点错误。

所以你可以这样做:

target_include_directories(LibA PRIVATE DirectoryA)
target_include_directories(LibB PRIVATE DirectoryB)

如果您必须支持旧版本的 CMake,您可以在目标上适当地设置 INCLUDE_DIRECTORIES 属性:

set_property(TARGET LibA
             PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryA)
set_property(TARGET LibB
             PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryB)

【讨论】:

  • 感谢您的回答。我的原始问题已更新,以更好地反映我的问题。
  • 我目前使用的是 2.8.7,所以目前还没有。如果 2.8.12 具有可以解决我的问题的功能,那么我将更新 CMake。
  • 我更新了我的答案以显示库而不是 exe。应该不需要升级 CMake - 使用任何一种方法都不应该导致库的包含目录成为 exe 的包含目录。
  • 所以我无意中将库“DirectoryA”之一安装到了我的 /usr/local/ 目录中,所以整个项目已经看到了它。我正在将库重新安装到 /opt/DirectoryA/ 并试一试。然而,重建这个库可能是一个过程。
  • 我认为这是一个设计问题。我猜LibA 可以自行构建,但是当您尝试构建MyExe 时,会发生故障。如果LibA.h 包含来自/opt/SomeLibrary2.0/include/ 的标头(直接或间接通过其其他包含文件之一),并且MyExe 包含LibA.h,则/opt/SomeLibrary2.0/include/ 必须可用作搜索MyExe 的路径。在我的脑海中,您也许可以考虑使用pimpl idiom 以避免将SomeLibrary2.0 的标头暴露给MyExe
猜你喜欢
  • 1970-01-01
  • 2017-07-12
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多