Ich mache eine Test-Setup einer C statischen Bibliothek und Programm. Der Bibliothekscode, in einem Unterverzeichnis 'foo' befindet sich meines Projekts, enthält die folgenden Dateien:Einschließlich Header-Datei aus der statischen Bibliothek
foo/foo.c:
#include <stdio.h>
void foo(void) {
printf("something");
}
foo/foo.h:
#ifndef foo_h__
#define foo_h__
extern void foo(void);
#endif
Mein Progamm-Code ist wie folgt:
test.c:
#include "foo.h"
int main() {
foo();
return 0;
}
Ich habe ein Build-Skript namens 'bauen', die enthält folgende Komponenten:
build:
#!/bin/bash
gcc -c -Wall -Werror foo/foo.c
ar rcs libfoo.a foo.o
gcc -static -o test test.c libfoo.a # I have also tried -L. -lfoo
Aber wenn ich bauen laufen, Es gibt mir den folgenden Fehler:
test.c:1:17: fatal error: foo.h: No such file or directory
#include "foo.h"
^
Compilation terminated
Es funktioniert jedoch, wenn ich die # include-Zeile weglasse, aber ich würde es vorziehen, wenn ich Header-Dateien in meinen statischen Bibliotheken verwenden könnte. Was mache ich falsch, und wie kann ich es beheben?
Aber der Header foo.h ist Teil der Bibliothek libfoo.a, oder? Außerdem war das Header-Guard-Problem ein Tippfehler, als ich es auf stackoverflow eintippte, was ich tat, weil ich auf Windows-SSH in ein Ubuntu-System bin. –
Nein. Eine Bibliothek enthält ausschließlich und nur Objektdateien. Header sind _nicht_ Objektdateien. Header sind nicht in Bibliotheken enthalten. (OK: Um absolut pedantisch korrekt zu sein, könnte man eine Header-Datei zu einer Bibliothek hinzufügen, aber der Compiler würde niemals in einer Bibliothek suchen - nur der Linker ('ld', normalerweise) sucht in Bibliotheken und sucht nur nach Objektdateien , nicht Kopfzeilen). –
Oh, ok. Danke, dass du das erklärst. Warum kann ich dann beispielsweise "ncurses.h" aus der ncurses-Bibliothek hinzufügen? –