2017-11-15 3 views
0

Ich versuche, eine statische Bibliothek (.a) in einem anderen Projekt zu verwenden. Ich möchte einen #include Header aus diesem .a machen, aber ich bin mit Fehlern.Headerdatei (.h) aus einer statischen Bibliothek (.a) verwenden

Zuerst habe ich versucht, H-Datei in der .a-Datei, um zu verstehen, zu suchen, wenn es unter .a existiert und ich:

Binary file libtest.a matches 

So ist der Header in unter der statischen Bibliothek. Dann füge ich auf diese Weise in dem 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 
      ) 

Allerdings, wenn ich die App im Android-Studio betreiben ich bekam:

Fatal error: 'example.h' file not found 

Und ich bin wie dies die C Import :

#include <example.h> 

Um eine Header-Datei zu importieren, ist es notwendig, weitere Schritte?

+1

Sie müssen das Verzeichnis der Header in der Includes-Verzeichnisliste Ihres Projekts festlegen. –

Antwort

1

Statische Bibliotheksdateien (.a unter Unix/Linux .lib unter Windows) tun normalerweise nicht enthalten Header. Ja, technisch ist es möglich, beliebige Dateien entlang der Objektdateien zu packen, aber die meisten Linker werden sich daran verschlucken und sich weigern, zur Arbeit zu gehen, wenn sie mit einem solchen Gräuel konfrontiert werden.

Der wahrscheinlichste Grund für die Suche nach dem Headernamen im Archiv ist, dass der Name der Headerdatei Teil der Debuggingmetadaten ist, die Teil der Bibliothek sind (damit ein Debugger binäre Speicherorte in Quelldateipositionen übersetzen kann)).

Sie müssen die Header separat installieren und den Installationsort beim Kompilieren als zusätzliches Include-Verzeichnis angeben.

0

Um eine Bibliothek zu verwenden, benötigen Sie zwei Dinge: den kompilierten Code für die Bibliothek (in einer .a-Datei, einer .so-Datei, einer .lib-Datei oder was auch immer) und separat eine Header-Datei, die die Einstiegspunkte beschreibt für die Bibliothek. Im Allgemeinen können Sie den Header nicht aus der Bibliothek ableiten.

Um beispielsweise die C++ - Standardbibliothek zu verwenden (die mit Ihrem Compiler als eine Art Bibliotheksdatei geliefert wird), verwenden Sie die Standard-Headerdateien, die Namen wie "iostream", "string" usw. haben.

Zum Beispiel, wenn Sie eine Bibliothek, den Code aus einer Quelldatei kompiliert enthält:

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

Sie benötigen eine Header-Datei, die diesen Einstiegspunkt beschreibt:

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

In jeder Quelldatei das ruft f Sie benötigen #include "mylibrary.h" und wenn Sie Ihre ausführbare Datei verknüpfen, müssen Sie mit dem kompilierten Code in der Bibliothek verknüpfen.

Verwandte Themen