这是我的CMakeLists.txt:
ADD_SUBDIRECTORY(third)
ADD_SUBDIRECTORY(utils)
ADD_SUBDIRECTORY(rpc)
但目录'rpc'将在目录'utils'之前编译,实际上'rpc'依赖于'utils',所以我会得到一个链接错误。
如何在'utils'之后编译'rpc'?
感谢。
答案 0 :(得分:3)
当您使用target_link_libraries()函数并将其传递给其他目标名称时,CMake会自动将此目标设置为依赖项。您也可以使用add_dependencies()手动指定依赖项。
另请注意,源编译顺序与您的问题无关。链接错误(我猜,你看到“未定义的引用”)是因为你没有正确链接你的目标。
答案 1 :(得分:2)
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)
答案 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