如何控制cmake的子目录编译顺序?

时间:2015-09-25 11:46:09

标签: compilation cmake subdirectory

这是我的CMakeLists.txt:

ADD_SUBDIRECTORY(third)
ADD_SUBDIRECTORY(utils)
ADD_SUBDIRECTORY(rpc)

但目录'rpc'将在目录'utils'之前编译,实际上'rpc'依赖于'utils',所以我会得到一个链接错误。

如何在'utils'之后编译'rpc'?

感谢。

4 个答案:

答案 0 :(得分:3)

当您使用target_link_libraries()函数并将其传递给其他目标名称时,CMake会自动将此目标设置为依赖项。您也可以使用add_dependencies()手动指定依赖项。

另请注意,源编译顺序与您的问题无关。链接错误(我猜,你看到“未定义的引用”)是因为你没有正确链接你的目标。

答案 1 :(得分:2)

  • 我也有同样的问题。
  • 我有开源库-jthread和jrtplib。我想通过一个主要的CmakeList.text构建它们,所以我创建了一个文件夹,如:
cpp
├─jrtplib
│  ├─src
│  └─CMakeFiles.txt
├─jthread
│    ├─src
│    └─CMakeFiles.txt
└─CMakeFiles.txt

和cpp / CMakeFiles.txt,例如:


cmake_minimum_required (VERSION 3.8)


set(JTHREAD_ENABLED 1)

# 包含子项目。

add_subdirectory ("jthread")
add_subdirectory ("jrtplib")

但是构建错误,它首先构建jrtplib,我认为是“ jr”>“ jt”,所以先构建jrtplib,它找不到libjthread.so,所以 target_link_libraries 错误 我找到了解决方法:


cmake_minimum_required (VERSION 3.8)

# ↓↓↓↓↓↓↓↓  attention ↓↓↓↓↓↓↓↓

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

# ↑↑↑↑↑↑↑↑  attention ↑↑↑↑↑↑↑↑

set(JTHREAD_ENABLED 1)
# copy jthread/src/*.h to C:/thirdParty/include/jthread 
set(JTHREAD_INCLUDE_DIRS "C:/thirdParty/include")
set(JTHREAD_LIBRARIES "libjthread.so")


# 包含子项目。
add_subdirectory (jthread)
add_subdirectory (jrtplib)


  • set xx_OUTPUT_DIRECTORY 可以在主cmake_build文件夹中设置库构建,因此jrtplib可以找到libjthread.so。
  • 建立成功...

答案 2 :(得分:1)

如果'rpc'取决于'utils':

utils CMAKELISTS.txt

project(utils)
add_library (utils SHARED ${PROJECT_SOURCE_LIST})

rpc CMAKELISTS.txt

project(rpc)
add_library (rpc SHARED ${PROJECT_SOURCE_LIST})
# must add this command to scan dependencies of target rpc
add_dependencies (rpc utils)
target_link_libraries (${TEST_SOURCE_FILE_NAME} libutils.so)

答案 3 :(得分:0)

我假设名为“ third”的项目是独立的,但是“ utils”取决于“ rpc”。尝试以下代码进行顺序构建

ADD_SUBDIRECTORY(third)
ADD_SUBDIRECTORY(utils "${CMAKE_CURRENT_BINARY_DIR}/utils_build")
ADD_SUBDIRECTORY(rpc "${CMAKE_CURRENT_BINARY_DIR}/rpc_build")

这将在给定的构建目录中建立一个“ _build”目录。并将二进制文件复制到那里。有关更多信息,请尝试

cmake --help-command ADD_SUBDIRECTORY