web-dev-qa-db-fra.com

cmake: manquant et aucune règle connue pour le faire lorsque j'importe une bibliothèque précompilée

Je souhaite importer une bibliothèque prédéfinie à l'aide de cet extrait 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)

Je l'ai lié à ma bibliothèque en tant que:

target_link_libraries(aes-crypto openssl-crypto)

La tentative de génération renvoie cette erreur:

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

J'ai trouvé que le set_target_properties la fonction n'aime pas les chemins relatifs.


À partir de Documentation CMake sur IMPORTED_LOCATION

Chemin d'accès complet au fichier principal sur le disque pour une cible IMPORTÉE.


Pour résoudre ce problème, j'ai plutôt utilisé le chemin d'accès complet à la bibliothèque.

Exemple:

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 )

23
Nathan F.

Vous pouvez utiliser set_property fonction avec attribut TARGET au lieu de set_target_properties, puis vous pouvez définir un chemin d'accès relativement à l'aide de macros ${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 ) 

Vous pouvez peut-être utiliser des macros ${PROJECT_SOURCE_DIR} tout en définissant le chemin de la lib avec set_target_properties mais je n'ai pas vérifié de cette façon.

3