1

私は gobject システムを学ぼうとしているので、gnome サイトのドキュメントをいくつか読んで、GObject を親とする単純な gobject を作成しました。コンパイルするたびに仕事を実行し続けるのはgcc嫌で、同時にビルドシステムも学びたいと思っていました。pkg-configgobject-2.0を検索するところまで機能するようになったautotoolsを試しました。

コマンド ラインからプロジェクトをコンパイルするには、次のようにします gcc *.c $(pkg-config --cflags --libs gobject-2.0)(書式設定のために余分なティックを削除する必要がありました)。とにかく <--- このコマンドは機能します。

ただしgcc $(pkg-config --cflags --libs gobject-2.0) *.c、これは同じコマンドである必要があり、これを返します。

main.c: In function 'main':
main.c:10:10: warning: initialization from incompatible pointer type [enabled by default]
/tmp/ccxO7wkX.o: In function `main':
main.c:(.text+0x1a): undefined reference to `g_type_init'
main.c:(.text+0x27): undefined reference to `g_type_create_instance'
/tmp/ccPu2beU.o: In function `a_get_type':
myobject.c:(.text+0x57): undefined reference to `g_type_register_static'
collect2: ld returned 1 exit status

はい、それは別の注文とまったく同じコマンドです。何が問題なのかわかりません。autotools/automake がビルドを行う方法は次のとおりです。

gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include   -g -O2 -lgobject-2.0 -lglib-2.0    -o GObjectTest main.o myobject.o  
main.o: In function `main':
/home/aj/Desktop/GObjectTest/src/main.c:9: undefined reference to `g_type_init'
/home/aj/Desktop/GObjectTest/src/main.c:10: undefined reference to `g_type_create_instance'
myobject.o: In function `a_get_type':
/home/aj/Desktop/GObjectTest/src/myobject.c:19: undefined reference to `g_type_register_static'
collect2: ld returned 1 exit status
make: *** [GObjectTest] Error 1

これは風変わりな gcc コンパイルのものですか? 私はclangを試しても役に立たなかったので、これはリンカの問題だと思いますか? 私にはまったくわかりませんが、そこにいる誰かがそうすることを望んでいました。これはかなりイライラします。

「問題のあるコード」は次のとおりです。

GType a_get_type (void)
{
  if (type == 0) {
    GTypeInfo info = {
      sizeof(AClass),
      NULL,
      NULL,
      (GClassInitFunc) a_class_init,
      NULL,
      NULL,
      sizeof(A),
      0,
      (GInstanceInitFunc) NULL
    };
    type = g_type_register_static (G_TYPE_OBJECT,
                   "AType",
                   &info, 0);
  }

  return type;
}

編集:これは私のautotoolsビルドの出力です。とにかくmake部分です:

$ make
make  all-recursive
make[1]: Entering directory `/home/aj/Desktop/GObjectTest'
Making all in src
make[2]: Entering directory `/home/aj/Desktop/GObjectTest/src'
gcc -DHAVE_CONFIG_H -I. -I..    -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include   -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
main.c: In function 'main':
main.c:10:10: warning: initialization from incompatible pointer type [enabled by default]
mv -f .deps/main.Tpo .deps/main.Po
gcc -DHAVE_CONFIG_H -I. -I..    -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include   -g -O2 -MT myobject.o -MD -MP -MF .deps/myobject.Tpo -c -o myobject.o myobject.c
mv -f .deps/myobject.Tpo .deps/myobject.Po
gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include   -g -O2 -lgobject-2.0 -lglib-2.0    -o GObjectTest main.o myobject.o  
main.o: In function `main':
/home/aj/Desktop/GObjectTest/src/main.c:9: undefined reference to `g_type_init'
/home/aj/Desktop/GObjectTest/src/main.c:10: undefined reference to `g_type_create_instance'
myobject.o: In function `a_get_type':
/home/aj/Desktop/GObjectTest/src/myobject.c:19: undefined reference to `g_type_register_static'
collect2: ld returned 1 exit status
make[2]: *** [GObjectTest] Error 1
make[2]: Leaving directory `/home/aj/Desktop/GObjectTest/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/aj/Desktop/GObjectTest'
make: *** [all] Error 2

興味深い部分は次のとおりです。置き換えるgcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -g -O2 -lgobject-2.0 -lglib-2.0 -o GObjectTest main.o myobject.ogcc -o GObjectTest main.o myobject.o -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -g -O2 -lgobject-2.0 -lglib-2.0機能します。

4

0 に答える 0