Sto effettuando una configurazione di prova di una libreria e un programma statico C. Il codice della libreria, che si trova in una sottodirectory 'pippo' del mio progetto, contiene i seguenti file:Incluso il file di intestazione dalla libreria statica
foo/pippo.c:
#include <stdio.h>
void foo(void) {
printf("something");
}
foo/foo.h:
#ifndef foo_h__
#define foo_h__
extern void foo(void);
#endif
Il mio codice progamma è il seguente:
test.c:
#include "foo.h"
int main() {
foo();
return 0;
}
Ho uno script di build, denominata 'costruire', che contiene quanto segue:
costruzione:
#!/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
Ma quando corro costruire, mi dà il seguente errore:
test.c:1:17: fatal error: foo.h: No such file or directory
#include "foo.h"
^
Compilation terminated
Funziona, tuttavia, quando ometto la riga #include, ma preferirei se potessi usare i file header nelle mie librerie statiche. Cosa sto sbagliando e come posso risolverlo?
Ma l'intestazione foo.h fa parte della libreria libfoo.a, non è vero? Inoltre, il problema della protezione dell'intestazione era un refuso quando l'ho ridigitato su StackOverflow, cosa che ho fatto perché sono su Windows SSHing in un sistema Ubuntu. –
No. Una libreria contiene solo ed esclusivamente file oggetto. Le intestazioni sono _not_ file oggetto. Le intestazioni non sono contenute nelle librerie. (OK: per essere assolutamente pedante, è possibile aggiungere un file di intestazione a una libreria, ma il compilatore non apparirebbe mai in una libreria: solo il linker ('ld', di solito) guarda nelle librerie, e cerca solo i file oggetto , non intestazioni). –
Oh, ok. Grazie per aver chiarito questo. Ma allora perché, ad esempio, posso includere, ad esempio, "ncurses.h" dalla libreria ncurses? –