我正在尝试学习一些libuv,似乎有一本很棒的书可以通过它。但是,这本书没有解释如何实际编译它。我在github提取的代码上运行make,并使用github(https://github.com/joyent/libuv)中描述的GYP编译。但是我不确定我需要包含哪些库来编译代码。我试着编译这段代码:
/* 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的快速教程,或者我还需要什么?
答案 0 :(得分:8)
通过自制程序安装libuv
:
$ gcc -luv main.c
答案 1 :(得分:5)
好的,明白了。我必须使用OSX“CoreFoundation”和“CoreServices”框架。以下命令成功编译:
gcc -o first first.c build/Release/libuv.a -framework CoreFoundation -framework CoreServices
答案 2 :(得分:1)
感谢您的解决方案 - 我正在努力解决同样的问题。
我开发了你的答案,以便我可以使用以下选项从任何文件夹进行编译和链接:
gcc -o first -L/my/folders/libuv/ -I/my/folders/libuv/include/ first.c -luv -framework CoreFoundation -framework CoreServices
另外,我使用以下步骤将库添加到 Eclipse 中:
添加头文件uv.h的路径:
右键单击项目,然后选择属性 - &gt; C / C ++常规 - &gt;路径和符号 - &gt;包含。点击添加.. ,然后在文本框中输入:
/my/folders/libuv/include/
点击应用 - &gt;好的。
添加库:
在同一屏幕中,如上所示,单击库。点击添加.. ,然后在文本框中输入:
uv
添加库的路径:
仍在同一屏幕上,点击图书馆路径。点击添加.. ,然后在文本框中输入:
/my/folders/libuv/
添加框架:
右键单击项目属性 - > C / C ++构建 - >设置 - >工具设置 - &gt;杂项 - &gt; Mac OS X C ++链接器。然后在标题为链接标记的文本框中添加:
-framework CoreFoundation –framework CoreServices
点击应用然后构建。
答案 3 :(得分:0)
您可以使用GYP为libuv生成xcodeproj(如libuv的README中所述),并将此xcodeproj添加到您的主Xcode项目中。
使用简单的shell脚本可以实现自动化(便于更新)(假设您将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 libuv的头文件在哪里: