1

我正在尝试学习 gobject 系统,因此我阅读了 gnome 站点上的一些文档,并制作了一个简单的 gobject,它是 GObject 的父级。我不想每次要编译时都继续运行gcc作业,同时我也想学习构建系统。我尝试了 autotools,我开始使用它来pkg-config搜索 gobject-2.0。

为了从命令行编译我的项目,我这样做:( 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