2013-04-28 2 views
3

Я пытаюсь выучить некоторый libuv, и кажется, что в нем есть замечательная книга. Однако книга не объясняет, как ее скомпилировать. Я запустил make на код, который я вытащил из github, и скомпилирован с GYP, как описано в github (https://github.com/joyent/libuv). Однако я не уверен, какие библиотеки мне нужно включить, чтобы получить код для компиляции. Я попытался скомпилировать этот код:Библиотеки для компиляции libuv на os x?

/* first.c */ 
#include <stdio.h> 
#include <uv.h> 

int main() { 
    uv_loop_t *loop = uv_loop_new(); 

    printf("Now quitting.\n"); 
    uv_run(loop, UV_RUN_DEFAULT); 

    return 0; 
} 

Я составил его с помощью следующей команды из libuv папки:

gcc -o first first.c build/Release/libuv.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) 
    "_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 
collect2: ld returned 1 exit status 

Может кто-то дайте мне быстрый учебник о том, как построить libuv, или если что-то еще мне нужно?

ответ

4

ОК, понял. Я должен использовать рамки OSX «CoreFoundation» и «CoreServices». Команда успешно компилируется:

gcc -o first first.c build/Release/libuv.a -framework CoreFoundation -framework CoreServices 
1

Спасибо за решение. Я боролся с той же проблемой.

Я разработал свой ответ, чтобы я мог собрать и связать из любой папки, используя следующие параметры:

gcc -o first -L/my/folders/libuv/ -I/my/folders/libuv/include/ first.c -luv -framework CoreFoundation -framework CoreServices 

Кроме того, я добавил библиотеку в Затмение, используя следующие шаги:

Чтобы добавить путь к файлу заголовка uv.h:

Щелкните правой кнопкой мыши по проекту и выберите Свойства-> C/C++ Общие-> Пути и символы-> Включает , Нажмите на Добавить .. и в текстовом поле введите:

/my/folders/libuv/include/ 

CLICK Apply-> Хорошо.

Чтобы добавить библиотеку:

В то время как в одном экране, как описано выше, нажмите библиотеки. Нажмите на Add .. и в текстовом поле введите:

uv 

Чтобы добавить путь к библиотеке:

Еще на одном экране нажмите на Library Paths. Нажмите Добавить .. и введите в текстовое поле:

/my/folders/libuv/ 

Для добавления рамки:

правой кнопкой мыши на проекте свойства-> C/C++ Build-> Setting-> Настройки инструмента -> Разное-> Mac OS X C++ Linker.Затем в текстовом поле с названием Linker Flags добавить:

-framework CoreFoundation –framework CoreServices 

Нажмите на Применить затем построить.

5

С libuv установлен через доморощенного сделать:

$ gcc -luv main.c 
0

Вы можете использовать Gyp для создания xcodeproj для libuv (как описано в README libuv), и добавить xcodeproj в свой основной проект Xcode.

Это может быть автоматизировано (для легкого обновления) с помощью сценария простой оболочки (предполагающих вы положили libuv подмодуль в Externals/libuv, но может быть изменено):

git submodule update --init 
git clone https://chromium.googlesource.com/external/gyp.git Externals/libuv/build/gyp 
Externals/libuv/gyp_uv.py -f xcode 

Тогда вы будете иметь возможность добавлять libuv как зависимость и к библиотекам, чтобы связать свою цель:

Xcode configuration

Последнее, что нужно сделать, это сказать Xcode, где Оре libuv заголовки:

Headers configuration

See this post