CMake: использование add_subproject с библиотекой с использованием include приводит к неверному относительному пути - PullRequest
0 голосов
/ 03 апреля 2020

Global CMakeLists.txt

Этот CMakeLists.txt компилирует несколько файлов C ++ (Qt5 / ...) с MO C и не является "специальным" ни в каком отношении.

Код, о котором идет речь, такой:

add_subdirectory(third-party/libwebrtc)
include_directories(third-party/libwebrtc)
target_link_libraries(${PROJECT_NAME} libwebrtc)

libwebrt c 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)
...

Полный libwebrt c source -> https://github.com/cloudwebrtc/libwebrtc-build/blob/dev/CMakeLists.txt

Ошибка на 'cmake ..'

Если я запускаю mkdir build; cd build; cmake .., я вижу, что CMake ищет include() в проекте верхнего уровня, а не в его подкаталоге, как я ожидал ,

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 правильно создает libwebrt c, но мой вызов include_directories, тот, что сверху Уровень CMakeLists.txt (не библиотека libwebrt c), хочет включить файлы, которые доступны только после полной сборки:

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 (..) .

Я взломал эту проблему, переименовав библиотеку в проект (libwebrtcx) внутри libwebrtc / CMakeLists.txt, а также в ExternalProject_Add (libwebrtcx ...) и добавив add_dependencies ($ {PROJECT_NAME} libwebrtcx) а можно ли это сделать без этого взлома?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Неправильно CMAKE_SOURCE_DIR

На мой взгляд, ошибка, по-видимому, находится здесь

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

CMAKE_SOURCE_DIR будет путем к вашему главному источнику-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})
0 голосов
/ 08 апреля 2020

Итак, в основном я сделал следующее:

libwebrt c структура проекта

  • переименовал папку в libwebrtcx
  • переименован в проект

    project(libwebrtcx)
    
  • изменен CMAKE_MODULE_PATH

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

libwebrt c CMakeLists.txt

заменил их все:

  • CMAKE_SOURCE_DIR с CMAKE_CURRENT_SOURCE_DIR и
  • CMAKE_BINARY_DIR с CMAKE_CURRENT_BINARY_DIR и с использованием

* *1030* текстов * моего проекта * CMT summary

С этим я получаю библиотеку libwebrtcx , которую нужно построить до ее фактического использования из-за вызова add_dependencies . Но для компоновщика мне было нужно исходное имя 'libwebrt c', поэтому я в основном ввел еще одну зависимость под названием libwebrt c.

Интересно, можно ли это сделать лучше? кстати тоже?!

...