Autoconf - einschließlich einer statischen Bibliothek (Neuling)

Ich versuche, meine Anwendung von manuellem Build auf Autoconf zu migrieren, was bisher sehr gut funktioniert. Aber ich habe eine statische Bibliothek, die ich nicht integrieren kann. Diese Bibliothek befindet sich NICHT an den üblichen Speicherorten der Bibliothek - der Speicherort der Binärdatei (.a-Datei) und des Headers (.h-Datei) wird als Konfigurationsargument angegeben. (Insbesondere wenn ich die .a-Datei nach / usr / lib verschiebe oder an eine andere Stelle, an die ich denken kann, es immer noch nicht funktioniert.) Es wird auch nicht traditionell benannt (es beginnt nicht mit "lib" oder "l") ").

Manuelle Kompilierung funktioniert mit diesen (Verzeichnis ist nicht vorhersehbar - dies ist nur ein Beispiel):

gcc ...  -I/home/john/mystuff  /home/john/mystuff/helper.a

(Äh, ich verstehe eigentlich nicht, warum auf die .a-Datei direkt verwiesen wird, nicht mit -L oder so. Ja, ich verstehe das Erstellen von C-Programmen nur halbwegs.)

So kann ich in meiner configure.ac das entsprechende configure-Argument verwenden, um den Header (.h-Datei) mit AC_CHECK_HEADER erfolgreich zu finden. Innerhalb des AC_CHECK_HEADER füge ich dann den Speicherort zu CPFLAGS hinzu und das #Include der Header-Datei im tatsächlichen C-Code nimmt ihn gut auf.

Gegeben ein configure-Argument, das in $ location und der Name der benötigten Dateien sind helper.h und helper.a (die beide im selben Verzeichnis sind), hier ist, was bis jetzt funktioniert:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"])

Wo ich auf Schwierigkeiten stoße, wird die Binärdatei (.a-Datei) eingebunden. Egal, was ich versuche, ich erhalte immer eine Fehlermeldung über undefinierte Verweise auf die Funktionsaufrufe für diese Bibliothek. Ich bin mir ziemlich sicher, dass es sich um ein Verknüpfungsproblem handelt, da ich mit dem C-Code viel Aufhebens machen und einen absichtlichen Fehler in den Funktionsaufrufen dieser Bibliothek machen kann, der frühere Fehler erzeugt, die darauf hinweisen, dass die Funktionsprototypen geladen und zum Kompilieren verwendet wurden.

Ich habe versucht, den Speicherort, der die .a-Datei enthält, zu LDFLAGS hinzuzufügen, und habe dann eine AC_CHECK_LIB ausgeführt, diese wurde jedoch nicht gefunden.

Möglicherweise ist meine Syntax falsch, oder ich vermisse etwas grundlegenderes, was nicht verwunderlich wäre, da ich ein Neuling bin und nicht wirklich weiß, was ich tue.

Hier ist was ich ausprobiert habe:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS -L$location"; 
    AC_CHECK_LIB(helper)])

Kein Würfel. Ich schätze, AC_CHECK_LIB sucht nach -lhelper (oder libhelper?), Daher bin ich mir nicht sicher, ob dies ein Problem ist. Daher habe ich es auch versucht (AC_CHECK_LIB weglassen und die .a direkt in LDFLAGS aufnehmen), ohne Glück:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS -L$location/helper.a"])

Um die manuelle Kompilierung zu emulieren, habe ich versucht, das -L zu entfernen, aber das hilft nicht:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS $location/helper.a"])

Ich habe andere Kombinationen und Permutationen ausprobiert, aber ich glaube, mir fehlt etwas grundlegenderes ....

================ UPDATE

Ich habe es geschafft, mit einem fest codierten Pfad zu der .a-Datei in Makefile.am zu arbeiten, indem ich _LDADD wie folgt verwende:

myprog_LDADD=/home/john/mystuff/helper.a

Aber ich kann den Speicherort der .a-Datei nicht vorhersagen. Aus irgendeinem Grund funktioniert die Definition von myprog_LDADD in configure.ac nicht (ich wünschte, es wäre so, ich kann meine dynamische Standortvariable verwenden), und keine Kombination von Änderungen an LDFLAGS, myprog_LDFLAGS, AM_LDFLAGS scheint zu funktionieren.

Wenn ich in Makefile.am versuche, die in configure.ac definierte Variablenposition zu verwenden, funktioniert das nicht

myprog_LDADD=($location)helper.a

================ UPDATE

Ich denke, ich habe es herausgefunden, aber da ich keine Ahnung habe, was ich tue, würde ich mich WIRKLICH über ein Feedback freuen. Ich habe AC_SUBST () verwendet, um myprog_LDADD von configure.ac zum Laufen zu bringen. Die endgültige Lösung sieht also so aus:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location" 
    myprog_LDADD="$location/helper.a" 
    AC_SUBST(myprog_LDADD)])

Antworten auf die Frage(2)

Ihre Antwort auf die Frage