Как переписать библиотеку на основе find_package в библиотеку, которая может быть встроена непосредственно в родительский проект? - PullRequest
1 голос
/ 14 апреля 2020

Библиотека libwebrtc из https://github.com/cloudwebrtc/libwebrtc-build/blob/dev/CMakeLists.txt была создана для использования с make; make install, и проект, который хочет использовать библиотеку, должен позже использовать find_package из CMake.

Однако я хочу изменить libwebrtc, чтобы его можно было добавить как подмодуль git в мой текущий проект в качестве пользовательской библиотеки, как, например, https://github.com/itay-grudev/SingleApplication, который компилируется, когда Я печатаю: cmake ..; превратить в статическую / Dynami c библиотеку, а затем связать в моем основном приложении. (Пример библиотеки Qt, на который я ссылаюсь ранее, сбивал с толку, так как это сборка вне моего основного проекта и связанная только с последующим - что я не хочу) Извините за эту путаницу.

Чтобы иметь возможность сделать это, я думаю, что ExternalProject_Add в https://github.com/cloudwebrtc/libwebrtc-build/blob/a24a5e5947658d43339d4bfd85d3f4c52fc71057/CMakeLists.txt#L100 необходимо изменить на add_library вызов.

Проблема здесь в том, что include_directories используется основным проектом до того, как библиотека будет полностью построена.

Вопрос

Как переписать libwebrtc для использования в качестве простого c библиотека с правильными зависимостями сборки, так что мой основной проект компилируется / связывается только после того, как сборка libwebrtc была завершена, а файлы пользовательских заголовков были сгенерированы в CMAKE_CURRENT_BINARY_DIR из libwebrtc.

Или в другими словами, как переписать libwebrtc для использования без необходимости вызывать make install для библиотеки, а затем использовать find_package для использования этой библиотеки.

Хак (который уже работает)

С этим хаком я уже могу:

  • Построить библиотеку из моего родительского проекта
  • Зависит от созданных заголовочных файлов, которые существуют только после того, как libwebrtc было построен полностью (таким образом, отложить основной проект здания до зависимости встречаются)
  • Зависит от сгенерированной библиотеки webrt c .a stati c для компоновщика, шаг

Я представляю, что make install будет работать с libwebrtc является статически связанным.

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)

Примечание. Требуется переименовать проект libwebrt c в libwebrtcx , а также ExternalProject_Add в https://github.com/cloudwebrtc/libwebrtc-build/blob/a24a5e5947658d43339d4bfd85d3f4c52fc71057/CMakeLists.txt#L100 должен быть переименован в libwebrtcx .

Примечание. Также требуется переименовать все CMAKE_BINARY_DIR в CMAKE_CURRENT_BINARY_DIR и CMAKE_SOURCE_DIR в CMAKE_CURRENT_SOURCE_DIR. Подробности можно найти здесь: CMake: использование add_subproject с библиотекой с помощью команды «Включить» приводит к неверному относительному пути

...