Cmake: отсутствует и не известно, как это сделать, когда я импортирую предварительно созданную библиотеку

Я хочу импортировать предварительно созданную библиотеку, используя этот фрагмент CmakeLists.txt:

add_library(openssl-crypto
            SHARED
            IMPORTED )
set_target_properties(openssl-crypto
                      PROPERTIES
                      IMPORTED_LOCATION
                      ${external_DIR}/libs/${ANDROID_ABI}/libcrypto.so )
include_directories(${external_DIR}/include/openssl)

Я связал это с моей библиотекой как:

target_link_libraries(aes-crypto openssl-crypto)

Попытка построить возвращает эту ошибку:

'/libs/arm64-v8a/libcrypto.so', needed by ...,  missing and no known rule to make it

Ответ 1

Я обнаружил, что функция set_target_properties не любит относительные пути.


Из Документация CMake на IMPORTED_LOCATION

Полный путь к основному файлу на диске для цели IMPORTED.


Чтобы решить эту проблему, я использовал полный путь к библиотеке.

Пример:

set_target_properties ( curl-lib 
                        PROPERTIES IMPORTED_LOCATION 
                        libs/${ANDROID_ABI}/libcurl.a )

. . . becomes . . . 

set_target_properties ( curl-lib 
                        PROPERTIES IMPORTED_LOCATION 
                        ${PROJECT_SOURCE_DIR}/src/main/cpp/libs/${ANDROID_ABI}/libcurl.a )

Ответ 2

Вы можете использовать функцию set_property с атрибутом TARGET вместо set_target_properties, а затем вы можете установить путь относительно с помощью макросов ${PROJECT_SOURCE_DIR}.

# import shared library libmylib.so    
add_library( my-imported-lib 
             SHARED 
             IMPORTED) 

# set the path to appropriate so files with appropriate architectures
set_property(TARGET 
             my-imported-lib 
             PROPERTY IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/<path_to_libs_directory>/${ANDROID_ABI}/libmy-imported-lib.so) 

...

# link imported library to your developed library
target_link_libraries( my-developed-lib 
                       my-imported-lib ) 

Возможно, вы можете использовать макросы ${PROJECT_SOURCE_DIR}, пока устанавливаете путь lib с помощью set_target_properties, но я не проверял этот путь.