Как я могу скомпилировать минимальную программу с помощью libuv?

Прошло довольно много времени с тех пор, как я писал программу на C, и даже в этом случае я всегда находил фактическую компиляцию и компоновку довольно запутанными.

Поскольку в последнее время я играю / работаю с node.js, мне стало достаточно любопытно, чтобы заглянуть под капот, и в настоящее время я смотрю на libuv.

Я нашел несколько отличных руководств, но обнаружил, что фактическая часть компиляции была в значительной степени пропущена. Скорее всего, из-за справедливого предположения, что кому интересно, наверное, много работает с gcc.

Я скачал последнюю версию libuv с gtihub в виде 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, но именно здесь я нахожусь, поэтому любая помощь будет очень признательна.

Я использую Убунту 13.04


person thomas-peter    schedule 11.10.2013    source источник


Ответы (2)


Это самый простой Makefile, который я мог заставить работать, но, очевидно, он специфичен для расположения libuv.a в моей системе. Я бы приветствовал редактирование/новый пост этого ответа, который предоставляет более общую строку компиляции.

main: main.c
    gcc -o main main.c /usr/local/lib/libuv.a -pthread
clean:
    rm main
person thomas-peter    schedule 11.10.2013

Чтобы немного улучшить предыдущий ответ, можно использовать pkg-config, чтобы избежать жесткого кодирования пути:

LDFLAGS = `pkg-config --libs libuv`

main: src/main.c
    $(CC) -o main src/main.c $(LDFLAGS)
person Steve Chavez    schedule 07.07.2021