全局 CMakeLists.txt
这个 CMakeLists.txt 使用 MOC 编译了一些 C++ 文件(Qt5/...),并且在任何方面都不是“特殊”的。
有问题的代码是这样的:
add_subdirectory(third-party/libwebrtc)
include_directories(third-party/libwebrtc)
target_link_libraries(${PROJECT_NAME} libwebrtc)
libwebrtc CMakeLists.txt
cmake_minimum_required(VERSION 3.3)
project(libwebrtc)
# Allow the use of IN_LIST operand
cmake_policy(SET CMP0057 NEW)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
${CMAKE_SOURCE_DIR}/CMakeModules)
find_package(Git REQUIRED)
include(FindLibraries)
include(Version)
include(Options)
include(TargetOsAndCpu)
...
完整的 libwebrtc 源 -> https://github.com/cloudwebrtc/libwebrtc-build/blob/dev/CMakeLists.txt
'cmake ..' 上的错误
如果我运行,mkdir build; cd build; cmake ..
我可以看到 CMakeinclude()
在顶级项目中搜索,而不是在它的子目录中,正如我所期望的那样。
joachim@thinkpad-x1:[~/projects/client/build]: cmake ..
-- CMAKE_SYSTEM_INFO_FILE:
-- CMAKE_SYSTEM_NAME:
-- CMAKE_SYSTEM_PROCESSOR:
-- CMAKE_SYSTEM:
-- CMAKE_C_COMPILER: /usr/bin/clang
-- CMAKE_CXX_COMPILER: /usr/bin/clang++
CMake Error at sources/third-party/libwebrtc/CMakeLists.txt:13 (include):
include could not find load file:
FindLibraries
CMake Error at sources/third-party/libwebrtc/CMakeLists.txt:14 (include):
include could not find load file:
Version
问题(原创)
除了通过从 CMakeModules 目录复制包含将库集成到我的基础项目中之外,我还能做些什么?
谢谢,下面已经回答了,仍然留在这里。
关于依赖的问题
add_subdirectory 调用正确构建了 libwebrtc,但我的 include_directories 调用,来自顶层 CMakeLists.txt(不是 libwebrtc 库)的调用,想要包含仅在完整构建后可用的文件:
include_directories(
${CMAKE_CURRENT_BINARY_DIR}/sources/third-party/libwebrtc/include/webrtc
${CMAKE_CURRENT_BINARY_DIR}/sources/third-party/libwebrtc/include/webrtc/third_party/libyuv/include/
${CMAKE_CURRENT_BINARY_DIR}/sources/third-party/libwebrtc/webrtc/src/third_party/abseil-cpp
)
如何使 cmake 依赖于库的完整构建然后构建主程序?通常使用add_custom_command(..)但由于我们使用的是add_subdirectory(..)我们不能也使用add_custom_command(..)。
我对这个问题的破解是将库重命名为 libwebrtc/CMakeLists.txt 内的 project(libwebrtcx) 以及 ExternalProject_Add(libwebrtcx ...) 并添加add_dependencies(${PROJECT_NAME} libwebrtcx)但可以在没有该hack的情况下完成?