Свяжите стороннюю библиотеку, которая связана зависимой библиотекой, используйте Cmake - PullRequest
0 голосов
/ 08 января 2020

Чтобы упростить зависимость, мы используем библиотеку-обертку, чтобы обернуть сторонние библиотеки, например, gradle. Например:

lib_wrapper -> третьи стороны libs

A -> libWrapper

B -> libWrapper

Таким образом, A, B могут использовать функции в третьей стороне , Но я записал файл camke, который я написал, не работает.

Файл cmake lib_wrapper:

project(lib_wrapper)
# emty.c is an empty c file, do not use any ib_thirdparty funciton
add_library(lib_wrapper SHARED empty.c)

target_link_libraries(lib_wrapper lib_thirdparty1.a)
target_link_libraries(lib_wrapper lib_thirdparty2.a)
target_link_libraries(lib_wrapper lib_thirdparty3.a)

Файл camke A:

project(alib)
add_library(A SHARED a.c)

# add dependency
add_subdirectory(${lib_wrapper_path} lib_wrapper/out)
add_dependencies(alib lib_wrapper)
add_library(lib_wrapper_import SHARED IMPORTED)
set_target_properties(lib_wrapper_import PROPERTIES IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib_wrapper_import.so")

target_link_libraries(alib lib_wrapper_import)

Я также пробую PUBLI C или ключевое слово INTERFACE в target_link_libraries, но оно не работает. Может ли кто-нибудь помочь мне?

1 Ответ

1 голос
/ 08 января 2020

Я бы порекомендовал иметь библиотеку оболочки в качестве библиотеки интерфейса. Например:

project(lib_wrapper)
add_library(lib_wrapper INTERFACE)
target_link_libraries(lib_wrapper lib_thirdparty1.a)
target_link_libraries(lib_wrapper lib_thirdparty2.a)
target_link_libraries(lib_wrapper lib_thirdparty3.a)
target_include_directories(lib_wrapper INTERFACE <enter the third party include folders here>)

, а затем в проекте:

project(alib)
add_library(A SHARED a.c)

# add dependency
add_subdirectory(${lib_wrapper_path})
target_link_libraries(alib lib_wrapper)

это фактически способ, с помощью которого cmake может обрабатывать цели, которые являются библиотеками только заголовков. Вызов target_include_directories для библиотеки интерфейсов также будет включать все включаемые папки сторонних библиотек, если вы добавите правильные пути.

Более полное руководство по целям интерфейса в cmake можно найти, например, здесь: http://mariobadr.com/creating-a-header-only-library-with-cmake.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...