2013-03-29 5 views
4

Je veux créer un serveur Web avec libuv et http-parser.Ne pas gérer la bibliothèque de liaison avec clang

La structure actuelle du projet est

Makefile 

/src 
    /main.c 

/deps 
    /libuv (git clone of libuv) 
    /http-parser (git clone of http-parser) 

Dans main.c j'ai défini ci-dessous comprend:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "uv.h" 
#include "http_parser.h" 

et le Makefile ressemble:

LDFLAGS = -L deps/libuv 

main: libuv http-parser 
    $(CC) src/main.c -o main.out deps/libuv/libuv.a deps/http-parser/http_parser.o $(LDFLAGS) 

libuv: 
    $(MAKE) -C deps/libuv libuv.a 

http-parser: 
    $(MAKE) -C deps/http-parser http_parser.o 

clean: 
    rm deps/libuv/libuv.a 
    rm deps/http-parser/http_parser.o 

Cela se produit lorsque la le compilateur essaie de lier http_parser.

make -C deps/libuv libuv.a 
make[1]: `libuv.a' is up to date. 
make -C deps/http-parser http_parser.o 
make[1]: `http_parser.o' is up to date. 
cc src/main.c -o main.out deps/libuv/libuv.a deps/http-parser/http_parser.o 
src/main.c:5:10: fatal error: 'http_parser.h' file not found 
#include "http_parser.h" 
     ^
1 error generated. 
make: *** [main] Error 1 

Lorsque je retire la http_parser de la comprend et le Makefile que je reçois une étrange erreur de génération de libuv:

Undefined symbols for architecture x86_64: 
    "_CFArrayCreate", referenced from: 
     _uv__fsevents_init in libuv.a(fsevents.o) 
    "_CFRunLoopAddSource", referenced from: 
     _uv__cf_loop_runner in libuv.a(darwin.o) 
    "_CFRunLoopGetCurrent", referenced from: 
     _uv__cf_loop_runner in libuv.a(darwin.o) 
    "_CFRunLoopRemoveSource", referenced from: 
     _uv__cf_loop_runner in libuv.a(darwin.o) 
    "_CFRunLoopRun", referenced from: 
     _uv__cf_loop_runner in libuv.a(darwin.o) 
    "_CFRunLoopSourceCreate", referenced from: 
     _uv__platform_loop_init in libuv.a(darwin.o) 
    "_CFRunLoopSourceSignal", referenced from: 
     _uv__cf_loop_signal in libuv.a(darwin.o) 
    "_CFRunLoopStop", referenced from: 
     _uv__platform_loop_delete in libuv.a(darwin.o) 
    "_CFRunLoopWakeUp", referenced from: 
     _uv__cf_loop_signal in libuv.a(darwin.o) 
    "_CFStringCreateWithCString", referenced from: 
     _uv__fsevents_init in libuv.a(fsevents.o) 
    "_CFStringGetSystemEncoding", referenced from: 
     _uv__fsevents_init in libuv.a(fsevents.o) 
    "_FSEventStreamCreate", referenced from: 
     _uv__fsevents_init in libuv.a(fsevents.o) 
    "_FSEventStreamInvalidate", referenced from: 
     _uv__fsevents_close in libuv.a(fsevents.o) 
    "_FSEventStreamRelease", referenced from: 
     _uv__fsevents_close in libuv.a(fsevents.o) 
    "_FSEventStreamScheduleWithRunLoop", referenced from: 
     _uv__fsevents_schedule in libuv.a(fsevents.o) 
    "_FSEventStreamStart", referenced from: 
     _uv__fsevents_schedule in libuv.a(fsevents.o) 
    "_FSEventStreamStop", referenced from: 
     _uv__fsevents_close in libuv.a(fsevents.o) 
    "_kCFRunLoopDefaultMode", referenced from: 
     _uv__cf_loop_runner in libuv.a(darwin.o) 
     _uv__fsevents_schedule in libuv.a(fsevents.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [main] Error 1 

Je suis coincé à cette question depuis hier et perdre mon espoir. .

état actuel de Makefile:

LDFLAGS = -Ldeps/libuv 
INCLFLAGS = -Ideps/http-parser 

main.o: libuv.a http-parser.o 
    $(CC) src/main.c $(INCLFLAGS) -o main.o deps/libuv/libuv.a deps/http-parser/http_parser.o $(LDFLAGS) 

libuv.a: 
    $(MAKE) -C deps/libuv libuv.a 

http-parser.o: 
    $(MAKE) -C deps/http-parser http_parser.o 

clean: 
    rm deps/libuv/libuv.a 
    rm deps/http-parser/http_parser.o 

sortie verbeuse:

#include "..." search starts here: 
#include <...> search starts here: 
deps/libuv 
deps/http-parser 
/usr/local/include 
/usr/bin/../lib/clang/4.2/include 
/usr/include 
/System/Library/Frameworks (framework directory) 
/Library/Frameworks (framework directory) 
End of search list. 
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o main.o -Ldeps/libuv /var/folders/4l/zj55m1gn289f6v04zfbl59bm0000gn/T/main-sRhCLM.o deps/libuv/libuv.a deps/http-parser/http_parser.o -lSystem /usr/bin/../lib/clang/4.2/lib/darwin/libclang_rt.osx.a 
Undefined symbols for architecture x86_64: 
    "_CFArrayCreate", referenced from: 
     _uv__fsevents_init in libuv.a(fsevents.o) 
    "_CFRunLoopAddSource", referenced from: 
     _uv__cf_loop_runner in libuv.a(darwin.o) 

Répondre

2

Je soupçonne que http_parser.h est pas dans le même répertoire que main.c. Copiez ce fichier là ou, de préférence, mettez à jour votre chemin INCLUDE.

HTTP_PARSER_INCLUDE= -I/home/wherever/http_parser 

main: libuv http-parser 
    $(CC) src/main.c -o main.out $(HTTP_PARSER_INCLUDE) deps/libuv/libuv.a deps/http-parser/http_parser.o $(LDFLAGS) 

L'autre erreur que vous obtenez à la suite de la suppression http_parser.h est probable que du bruit en raison de ne pas la construction propre pour commencer. Votre règle "principale" telle que vous l'avez déclarée ci-dessus construit "main.out" au lieu de "main". Cela pourrait aussi avoir quelque chose à voir avec Faire essayer de construire quelque chose à partir de rien.

Mettez à jour - vous devez ajouter -framework CoreFoundation à votre ligne de commande pour supprimer les erreurs de l'éditeur de liens.

+0

vous semblez raison à propos du drapeau inclus. Il n'y a plus d'erreur sur le http_parser mais l'erreur sur la liaison de libuv reste. J'ai ajouté le Makefile mis à jour qui utilise maintenant les mêmes noms de règles que les fichiers de sortie – bodokaiser

+0

Vous êtes sur un Mac, n'est-ce pas? Vous devez ajouter "-framework CoreFoundation" à votre ligne de commande. – selbie

+0

merci cela était presque. J'ai ajouté votre drapeau mais là où il reste des symboles indéfinis. J'ai donc vérifié le makefile de libuv pour plus de frameworks et les ai trouvés ici: https://github.com/joyent/libuv/blob/master/config-unix.mk#L76-L78 Maintenant ça marche. Merci beaucoup! – bodokaiser

Questions connexes