【问题标题】:CMake library adjacent subdir dependencyCMake库相邻子目录依赖
【发布时间】:2014-10-07 04:29:13
【问题描述】:

我有以下目录结构

A                                  # produces libA
  CMakeLists.txt
  includes
    file.h
  sources
    file.cpp
B                                  # produces libB depends on libA
  CMakeLists.txt
  includes
     ...
  sources
     ...
app                                # produces executable, depends on libA and libB
  CMakeLists.txt
  includes
    ...
  sources
    ...

我希望libA.solibB.so 都可以独立使用,并且可供其他应用程序以及app 使用。

使用 CMake 管理此问题的简洁方法是什么。

A/CMakeLists.txt

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/includes)
...
ADD_LIBRARY(a SHARED ${A_SOURCES})

B/CMakeLists.txt

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/includes)
ADD_sUBDIRECTORY(../A)
# ^^^ This wont work
...
ADD_LIBRARY(b SHARED ${B_SOURCES})

app/CMakeLists.txt 也会出现同样的问题,你不能 ADD_SUBDIRECTORY 兄弟姐妹

我不想用明确的目录名称硬编码路径。我想我并不孤单,更多的人也面临同样的问题。那么这个问题的常规解决方案是什么?

我应该放置A/a.cmakeB/b.cmake 并声明A_INCLUDE_DIRSB_INCLUDE_DIRS。但是 A 又不是 B 的子目录

如果我在那里制作B/a.cmakeapp/a.cmakeapp/b.cmake 文件和SET 变量INCLUDE_DIRS 并将它们包含在他们的CMakeLists.txt 中?但这是解决这个问题的标准方法吗?或者这甚至会起作用吗?

问题 2

另一件事我尝试将main.cppCMakeLists.txt 放在root 上(例如应用程序的父级,a,b)。在那里我可以很容易地ADD_SUBDIRECTORY(A),因为它确实是一个子目录。我做了

SET(A_INCLUDE_DIRS
  ${CMAKE_CURRENT_SOURCE_DIR}/includes
)

A/CMakeLists.txt。并希望在 root/CMakeLists.txt 中获得该变量,但它不起作用。但是如果我将PARENT_SCOPESCOPESET 一起使用,它就可以工作,但我不知道这样配置是否可以,或者它是一种黑客行为?

【问题讨论】:

    标签: c++ cmake dependencies


    【解决方案1】:

    你需要顶级CMakeLists.txt:

    add_subdirectory(A)
    add_subdirectory(B)
    add_subdirectory(app)
    

    app/CMakeLists.txt内部:

    add_executable(app ...)
    target_link_libraries(app A B)
    

    【讨论】:

    • B 如何链接到 libA。如果我只尝试构建 B ?以及如何以及在哪里获得 A_INCLUDE_DIRS 变量集?
    • @DiproSen 更改顺序,先添加子目录 B 然后你的库目标 B 链接:target_link_libraries(A B)
    • and how and where will I get A_INCLUDE_DIRS Variable set? 您可以在顶部 CMake 文件中添加命令 include_directories(A) 或在目录 A 中使用 target_inlude_directories(A PUBLIC "${CMAKE_CURRENT_LIST_DIR}"),当您将库 A 链接到您的应用程序时,这将自动添加标题位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多