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

21

这是我的CMakeLists.txt:

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

但是目录'rpc'将会在目录'util'之前编译,实际上'rpc'依赖于'util',因此我会收到链接错误。

我该如何让'rpc'在'util'之后编译?

谢谢。


1
你确定在utils之前编译了rpc吗?错误信息是什么? - Raul Laasner
你是对的,'rpc' 在 'utils' 之后编译,但需要链接 'libutils.a'。在编译 'utils' 后,命令 'make install' 还没有执行。 - Yun Wen
RPC怎么样才能获取到utils的头文件,从而在链接之前进行编译呢? - Sam Liddicott
4个回答

10

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

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


1
我同意并想补充一般规则,即头文件/包含依赖很可能还需要链接依赖。还有静态库的循环依赖的可能性。添加set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_DEBUG_MODE 1)到主CMakeLists.txt可以帮助分析我的依赖问题。 - Florian

6
如果'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)

为什么需要显式调用add_dependencies?target_link_libraries不会隐式创建依赖关系吗? - Kobi

2
  • 我和你有同样的问题。
  • 我拥有开源库——jthread和jrtplib。我想通过一个主CMakeList.txt文件来构建它们,因此我创建了一个文件夹,如下所示:
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)


  • 设置xx_OUTPUT_DIRECTORY可以将库构建在主要的cmake_build文件夹中,这样jrtplib就可以找到libjthread.so。
  • 构建成功...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接