25 November 2012

mac で libuv を使ったプログラムのコンパイルするには -framework CoreServices というフラグが必要だった

uvbook を読んでいて, 付属するサンプルコードの Makefile を見ていると mac の場合 -framework CoreServices というフラグをつけていた

ifeq (Darwin, $(uname_S))
CFLAGS+=-framework CoreServices
SHARED_LIB_FLAGS=-bundle -undefined dynamic_lookup -o plugin/libhello.dylib
endif

たしかに単純な hello world のサンプルでもこのオプションを付けないとコンパイルできなかった. hello world のサンプルは uv_loop_new() して uv_run() するだけの簡単なものだ.

#include <stdio.h>
#include <uv.h>

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

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

    return 0;
}

以下のようにするとコンパイルが通るが,

$ gcc -g -Wall -I../../libuv/include ../../libuv/uv.a -framework CoreServices main.c

framework オプションがないと次のようにリンクする共有ライブラリが足りてない感じのエラーが出る.

$ gcc -g -Wall -I../../libuv/include ../../libuv/uv.a main.c
Undefined symbols for architecture x86_64:
  "_AbsoluteToNanoseconds", referenced from:
      _uv_hrtime in uv.a(darwin.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

たぶん libuv の darwin 周りのコードでプラットフォーム独自の何かを使っていて, それをリンクさせるには -framework CoreServices とさせないとだめなんだろう.