这是我的CMakeLists.txt:
ADD_SUBDIRECTORY(third)
ADD_SUBDIRECTORY(utils)
ADD_SUBDIRECTORY(rpc)
但是目录'rpc'将会在目录'util'之前编译,实际上'rpc'依赖于'util',因此我会收到链接错误。
我该如何让'rpc'在'util'之后编译?
谢谢。
这是我的CMakeLists.txt:
ADD_SUBDIRECTORY(third)
ADD_SUBDIRECTORY(utils)
ADD_SUBDIRECTORY(rpc)
但是目录'rpc'将会在目录'util'之前编译,实际上'rpc'依赖于'util',因此我会收到链接错误。
我该如何让'rpc'在'util'之后编译?
谢谢。
当您使用target_link_libraries()函数并传递其他目标名称时,CMake会自动将此目标设置为依赖项。您还可以使用add_dependencies()来手动指定依赖项。
另外请注意,源代码编译顺序与您的问题无关。链接错误(我猜想,您看到的是“未定义引用”)是因为您没有正确链接您的目标。
set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_DEBUG_MODE 1)
到主CMakeLists.txt
可以帮助分析我的依赖问题。 - Florianproject(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)
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)
我假设名为“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