如何用libuv编译最小程序?

时间:2013-10-11 10:13:06

标签: c gcc makefile libuv

自从我用C编写程序以来已经有一段时间了,即便如此,我总是发现实际的编译和链接非常令人困惑。

由于我最近一直在玩/使用node.js,我已经变得很好奇,开始瞥见我的目前正在看libuv。

我找到了一些优秀的指南,但发现实际的编译部分已被大量跳过。很可能是由于公平的假设,任何有趣的人都可能与gcc合作很多。

我已经从gtihub下载了最新的libuv作为zip并已解压缩到一个工作文件夹中。我按照README.md编译并安装它。所有这一切都很顺利,没有任何问题。

我要编译的代码来自http://nikhilm.github.io/uvbook/basics.html

#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;
}

我把它保存为main.c

这是我正在使用的Makefile,我怀疑这是问题,因为它是从各种来源拼凑而成的,而我在这方面的知识至少可以说是多云。

main: main.c
    gcc -g  -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I./libuv-master/include/ -o main main.c -pthread -lrt -lm
clean:
    rm main

这是运行make的结果。

/tmp/ccJbU03z.o: In function `main':
/home/tom/libuv-test/main.c:5: undefined reference to `uv_loop_new'
/home/tom/libuv-test/main.c:8: undefined reference to `uv_run'
collect2: error: ld returned 1 exit status

我意识到这并不完全与libuv有关,但这只是我所处的位置,所以任何帮助都会非常感激。

我正在使用Ubuntu 13.04

2 个答案:

答案 0 :(得分:7)

我能做的最简单的Makefile是这个,但显然它特定于我的系统上的libuv.a的位置。我欢迎这个答案的编辑/新帖子提供更通用的编译行。

main: main.c
    gcc -o main main.c /usr/local/lib/libuv.a -pthread
clean:
    rm main

答案 1 :(得分:0)

为了稍微改进之前的答案,可以使用 pkg-config 来避免对路径进行硬编码:

LDFLAGS = `pkg-config --libs libuv`

main: src/main.c
    $(CC) -o main src/main.c $(LDFLAGS)