2013-03-29 2 views
4

Я хочу создать веб-сервер с 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) 

ответ

2

Я подозреваю, что http_parser.h не в том же каталоге, main.c. Либо скопируйте этот файл, либо, желательно, обновите свой путь 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) 

Другая ошибка, которую вы получите в результате удаления http_parser.h, скорее всего, просто шум в результате не строить в чистоте, чтобы начать с. Ваше «основное» правило, как вы его заявили выше, строит «main.out» вместо «main». Это может также иметь какое-то отношение к Make, пытающемуся построить что-то из ничего.

Обновление - вам необходимо добавить -framework CoreFoundation в свою командную строку, чтобы удалить ошибки компоновщика.

+0

Вы, кажется, правильно о флагом включения. В отношении http_parser больше нет ошибок, но ошибка при связывании libuv остается. Я добавил обновленный Makefile, который теперь использует те же имена правил, что и выходные файлы. – bodokaiser

+0

Вы на Mac, не так ли? Вам нужно добавить «-Framework CoreFoundation» в свою командную строку. – selbie

+0

спасибо, что это было почти так. Я добавил ваш флаг, но там, где некоторые оставшиеся неопределенные символы. Поэтому я проверил файл libuv makefile для получения дополнительных фреймворков и нашел их здесь: https://github.com/joyent/libuv/blob/master/config-unix.mk#L76-L78 Теперь он работает. Большое спасибо! – bodokaiser

Смежные вопросы