2016-03-28 12 views
0

Ich verwende das HTParse.c-Modul für eines meiner C-Projekte. Jedoch, wenn sie mitunbekannter Typname BOOL-Kompilierfehler mit Linked Headerfile

gcc -o project project.c -lpthread 

Kompilieren erhalte ich die folgenden Compiler-Fehler aus der Header-Datei:

In file included from Gserve.c:12:0: 
    /usr/local/include/w3c-libwww/HTParse.h:117:8: error: unknown type name ‘BOOL’ 
    extern BOOL HTURL_isAbsolute (const char * url); 
     ^
    /usr/local/include/w3c-libwww/HTParse.h:192:8: error: unknown type name ‘BOOL’ 
    extern BOOL HTCleanTelnetString (char * str); 
     ^

Ich habe stdbool.h mit C99 enthalten und dass C90 nicht den boolean-Datentyp . Auch nach dem Einfügen dieses Headers bleiben die Fehler bestehen. Ich habe diese Header wie folgt enthalten:

#include<stdbool.h> 
#include<w3c-libwww/HTParse.h> 

Konnte etwas während der Installation der Bibliothek schief gelaufen sein? Ich habe nichts Verdächtiges in der sehen, wenn macht jedoch habe ich am Ende einige Fehler bemerken ‚sudo make install‘ ...

collect2: error: ld returned 1 exit status 
Makefile:660: recipe for target 'libapp_2' failed 
make[2]: *** [libapp_2] Error 1 
make[2]: Leaving directory '/usr/local/src/w3c-libwww-  5.4.0/Library/Examples' 
Makefile:174: recipe for target 'install-recursive' failed 
make[1]: *** [install-recursive] Error 1 
make[1]: Leaving directory '/usr/local/src/w3c-libwww-5.4.0/Library' 
Makefile:263: recipe for target 'install-recursive' failed 
make: *** [install-recursive] Error 1 

ich bin mit Ubuntu 15.10.

Haben Sie irgendwelche Ideen, dies zu beheben?

Vielen Dank!

+0

"Ich habe gelesen, dass stdbool.h mit C99 enthalten und dass C90 den booleschen Datentyp nicht unterstützt" - Nun, 'BOOL' ist von * weder *. Es ist normalerweise ein Makro, das in einem * Windows * -Header als 'int' definiert ist, oder ein Kompatibilitätsheader zum Kompilieren auf Nicht-Windows-Plattformen. Es scheint, du hast * weder *. – WhozCraig

+0

Haben Sie andere # include-Anweisungen, bevor diese zitiert werden? Können Sie eine Datei kompilieren, die nur aus '#include ' besteht? –

Antwort

1

Die Ursache dieses Compiler-Fehler ist, dass w3c-libwwwBOOL im Header definiert wwwsys.h, und Sie sind nicht #include sie oder einem der andere w3c-libwww Header ing, die bereits #include es ist. Die API vorformulierten Bibliothek soll durch Erklärung:

#include <w3c-libwww/WWWLib.h> 

bevor irgendetwas anderes. Sehen Sie sich die mitgelieferten Beispiele entweder über the online documentation oder im Ordner Library/Examples im Paket an.

Durch Korrigieren dieses Fehlers können Sie jedoch kein Programm mit der Bibliothek kompilieren und verknüpfen, da Sie nicht erstellt und die Bibliothek installiert haben.

Der Fehler, den Sie von sudo make install bemerkt bedeutet, dass Sie haben nicht die Bibliothek installiert. Aber der Fehler in Frage:

collect2: error: ld returned 1 exit status 
Makefile:660: recipe for target 'libapp_2' failed 

ist kein Fehler der Installation der Bibliothek und ihrer Header auf ihre Zielverzeichnisse: Es besagt, dass Verknüpfung der Bibliothek ist fehlgeschlagen.

make install hat daher versucht, make die Bibliothek, wie es immer so lange tun wird als Bibliothek hat noch nicht gebaut worden, und die make ist fehlgeschlagen, weil die Bibliothek nicht verknüpft werden kann. Wenn ich versuche, the package, auf Ubuntu 15 zu bauen.10, ./configure gelingt aber make irgendwie:

gcc -g -O2 -Wall -o .libs/libapp_2 libapp_2.o ../src/.libs/libwwwinit.so ../src/.libs/libwwwapp.so ../../Library/src/.libs/libwwwxml.so ../../modules/expat/xmlparse/.libs/libxmlparse.so ../../modules/expat/xmltok/.libs/libxmltok.so ../src/.libs/libwwwhtml.so ../src/.libs/libwwwtelnet.so ../src/.libs/libwwwnews.so ../src/.libs/libwwwhttp.so ../src/.libs/libwwwmime.so ../src/.libs/libwwwgopher.so ../src/.libs/libwwwftp.so ../src/.libs/libwwwdir.so ../src/.libs/libwwwcache.so ../src/.libs/libwwwstream.so ../src/.libs/libwwwfile.so ../src/.libs/libwwwmux.so ../src/.libs/libwwwtrans.so ../src/.libs/libwwwcore.so ../src/.libs/libwwwutils.so -lm ../../modules/md5/.libs/libmd5.so -ldl -Wl,--rpath -Wl,/home/imk/develop/w3c/lib 
../src/.libs/libwwwfile.so: undefined reference to `HTDir_addElement' 
../src/.libs/libwwwfile.so: undefined reference to `HTDir_free' 
../src/.libs/libwwwfile.so: undefined reference to `HTDir_new' 
collect2: error: ld returned 1 exit status 
Makefile:660: recipe for target 'libapp_2' failed 

Kein Zweifel, dass das, was Sie auch gesehen. Sie müssen einen Verbindungsfehler von eine Bibliothek oder eine ausführbare Datei, die Sie versuchen zu erstellen, als nicht nur "verdächtig", sondern völlig tödlich betrachten. Bis Sie es verknüpfen, haben Sie keine Bibliothek.

Fazit: Dieses (14 Jahre alte) Paket ist auf Ubuntu 15.10 gebrochen. Es scheint nicht, eine bekannte Lösung zu sein. Ich schlage vor, Sie reduzieren Ihre Verluste.

+0

Vielen Dank für Ihre Antwort! Sie haben sicherlich einige meiner allgemeinen Verwirrung mit Bibliotheken aufgeklärt und mir ein paar Stunden Kopfschmerzen erspart. Ein paar Fragen, wenn du Zeit hast: Zuvor dachte ich, dass die 'make'-Anweisung dazu gedacht war, die Quelle der Bibliothek zu kompilieren, warum sprichst du immer wieder davon, dass' make '_linkage_ failure verursacht? Nachdem ich meine "make" -Ausgabe zurückgelegt hatte, bemerkte ich einige Compiler ** Warnungen **, aber keine waren tatsächliche Fehler. Anders gesagt, hätten Sie Empfehlungen zum Parsen einer URL in C, wenn diese Bibliothek für mich keine Option ist? – Lamar

+0

@Lamar Ein Makefile beschreibt typischerweise, aber nicht unbedingt, das vollständige Rezept zum Erstellen einer ausführbaren Datei aus seinem Quellcode, ausgedrückt in Beziehungen der Form: * wenn Element A in Bezug auf die Elemente B out ist , C ... aus dem es gemacht wird, dann re-make es, indem Sie X, Y, Z ... *. Dieses Rezept im Wesentlichen beteiligt * Compiling * die Quelldateien zu Objektdateien, dann * Verknüpfung * der Objektdateien mit angegebenen oder Standard-Bibliotheken, um die ausführbare Datei zu machen. Wenn Sie die Rolle des Linkers nicht verstehen, versuchen Sie zu laufen, bevor Sie gehen können: besser erforschen Sie es. –

+0

@Lamar Wie für eine alternative Bibliothek kann ich nicht persönlich empfehlen, aber [this] (http://stackoverflow.com/q/2616011/1362568) und [dies] (http://stackoverflow.com/q/ 726122/1362568) kann helfen. –