Я хочу создать веб-сервер с libuv и http-parser.Не удается связать библиотеку с clang
Текущая структура проекта
Makefile
/src
/main.c
/deps
/libuv (git clone of libuv)
/http-parser (git clone of http-parser)
В main.c я определил следующие включает в себя:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "uv.h"
#include "http_parser.h"
и Makefile выглядит следующим образом:
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
Это происходит, когда компилятор пытается связать 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
Когда я удалить http_parser из ряда включает в себя и Makefile, чем я получаю странные ошибки 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
Я застрял в этом вопросе, так как вчера и потерять свою надежду на всех. .
Текущее состояние 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
подробный вывод:
#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)
Вы, кажется, правильно о флагом включения. В отношении http_parser больше нет ошибок, но ошибка при связывании libuv остается. Я добавил обновленный Makefile, который теперь использует те же имена правил, что и выходные файлы. – bodokaiser
Вы на Mac, не так ли? Вам нужно добавить «-Framework CoreFoundation» в свою командную строку. – selbie
спасибо, что это было почти так. Я добавил ваш флаг, но там, где некоторые оставшиеся неопределенные символы. Поэтому я проверил файл libuv makefile для получения дополнительных фреймворков и нашел их здесь: https://github.com/joyent/libuv/blob/master/config-unix.mk#L76-L78 Теперь он работает. Большое спасибо! – bodokaiser