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)
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
Vous êtes sur un Mac, n'est-ce pas? Vous devez ajouter "-framework CoreFoundation" à votre ligne de commande. – selbie
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