0

全局 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的情况下完成?

4

2 回答 2

2

错误的 CMAKE_SOURCE_DIR

在我看来,错误似乎在这里

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
    ${CMAKE_SOURCE_DIR}/CMakeModules)

CMAKE_SOURCE_DIR将是您的主要源目录的路径。将其更改为

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
    ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules)

用作外部依赖

另一个想法是自己构建项目并在项目中将其用作外部依赖项。

find_package(LibWebRTC REQUIRED)
include(${LIBWEBRTC_USE_FILE})

target_link_libraries(my-app ${LIBWEBRTC_LIBRARIES})
于 2020-04-03T08:26:17.113 回答
0

所以我基本上做的是这样的:

libwebrtc 项目结构

  • 将文件夹重命名为libwebrtcx
  • 重命名项目

    project(libwebrtcx)
    
  • 修改了 CMAKE_MODULE_PATH

    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
    -    ${CMAKE_SOURCE_DIR}/CMakeModules)
    +    ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules)
    

libwebrtc CMakeLists.txt

替换了所有这些:

  • CMAKE_SOURCE_DIR 与 CMAKE_CURRENT_SOURCE_DIR 和
  • CMAKE_BINARY_DIR 与 CMAKE_CURRENT_BINARY_DIR 并使用

我项目的 CMakeLists.txt

add_dependencies(${PROJECT_NAME} libwebrtcx)
add_subdirectory(third-party/libwebrtcx)
include_directories(
  ${CMAKE_BINARY_DIR}/sources/third-party/libwebrtcx/include/webrtc
  ${CMAKE_BINARY_DIR}/sources/third-party/libwebrtcx/include/webrtc/third_party/libyuv/include/
  ${CMAKE_BINARY_DIR}/sources/third-party/libwebrtcx/webrtc/src/third_party/abseil-cpp
)

add_library(libwebrtc STATIC IMPORTED)
set_property(TARGET libwebrtc PROPERTY IMPORTED_LOCATION "${CMAKE_BINARY_DIR}/sources/third-party/libwebrtcx/webrtc/src/out/Release/obj/libwebrtc.a")
target_link_libraries(${PROJECT_NAME} libwebrtc)

概括

有了这个,由于add_dependencies调用,我在实际使用它之前构建了库libwebrtcx 。但是对于链接器,我需要原始的“libwebrtc”名称,所以我基本上引入了另一个名为libwebrtc的依赖项。

我想知道这是否也可以以更好的方式完成?!

于 2020-04-08T06:40:23.910 回答