3 votes

Utiliser le fichier d'en-tête (.h) d'une bibliothèque statique (.a)

J'essaie d'utiliser une bibliothèque statique (.a) dans un autre projet. Je veux faire un #include d'un en-tête de ce .a, mais j'ai des erreurs.

Tout d'abord, j'ai essayé de rechercher le fichier .h dans le fichier .a, afin de comprendre s'il existe sous .a et j'obtiens :

Binary file libtest.a matches

L'en-tête se trouve donc sous la bibliothèque statique. Ensuite, j'insère ceci dans le fichier CMakeFiles.txt :

cmake_minimum_required(VERSION 3.4.1)

add_library(hello-jni SHARED
            hello-jni.c)

# Include libraries needed for hello-jni lib
target_link_libraries(hello-jni
                      android
                      log
                     /home/prvs/android-ndk/hello/jni/app/src/main/cpp/libtest.a
              )

Cependant, lorsque j'exécute l'application dans Android-Studio, j'obtiens :

Fatal error: 'example.h' file not found

Et j'importe vers le C comme ceci :

#include <example.h>

Pour importer un fichier d'en-tête, il faut suivre d'autres étapes ?

2voto

datenwolf Points 85093

Fichiers de bibliothèque statique ( .a sur Unix/Linux .lib sous Windows) se fait normalement no contiennent des en-têtes. Oui, il est techniquement possible d'empaqueter des fichiers arbitraires avec les fichiers objets, mais la plupart des éditeurs de liens s'en étoufferont et refuseront de travailler lorsqu'ils seront confrontés à une telle abomination.

La raison la plus probable pour laquelle la recherche du nom de l'en-tête dans l'archive correspond est que le nom du fichier d'en-tête fait partie des métadonnées de débogage qui font partie de la bibliothèque (afin qu'un débogueur puisse traduire les emplacements binaires en emplacements de fichiers sources).

Vous devez installer les en-têtes séparément et spécifier l'emplacement d'installation lors de la compilation en tant que répertoire d'inclusion supplémentaire.

0voto

Pete Becker Points 27371

Pour utiliser une bibliothèque, vous avez besoin de deux choses : le code compilé de la bibliothèque (dans un fichier .a, un fichier .so, un fichier .lib, ou autre) et, séparément, un fichier d'en-tête qui décrit les points d'entrée de la bibliothèque. En général, vous ne pouvez pas dériver l'en-tête de la bibliothèque.

Par exemple, pour utiliser la bibliothèque standard C++ (qui est fournie avec votre compilateur sous la forme d'un fichier de bibliothèque), vous utilisez les fichiers d'en-tête standard, qui portent des noms tels que "iostream", "string", etc.

Par exemple, si vous avez une bibliothèque qui contient du code compilé à partir d'un fichier source :

// source.cpp
#include <iostream>
void f(int i) {
    std::cout << i << '\n';
}

vous avez besoin d'un fichier d'en-tête qui décrit ce point d'entrée :

// mylibrary.h
void f(int i);

Dans chaque fichier source qui appelle f vous avez besoin #include "mylibrary.h" et lorsque vous liez votre exécutable, vous devez le lier au code compilé dans la bibliothèque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X