2017-10-12 45 views
0

我想学习glib和gObject的网络项目。Glib链接错误g_socket_new

下面是用于编译(使用pkg配置后能得到输出)的命令:

gcc socket1.c -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgobject-2.0 -lglib-2.0 

socket1.c,剥离后,以确定问题是:

#include <glib.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <gio/gio.h> 

static GSocket *mySocket; 
int main(int argc, char **argv) { 

    GError *err1 = NULL; 

    mySocket = g_socket_new (G_SOCKET_FAMILY_IPV4, 
       G_SOCKET_TYPE_STREAM, 
       G_SOCKET_PROTOCOL_TCP, 
       &err1); 

} 

的错误是:

/tmp/ccKIEXOi.o: In function `main': 
    socket1.c:(.text+0x3d): undefined reference to `g_socket_new' 
    collect2: error: ld returned 1 exit status 

我曾尝试使用readelf -wsnm查看我是否可以在链接的任何.so文件中看到g_new_socket。我没有看到任何。我需要链接到一个单独的库吗?哪里/是哪个?

回答

3

您需要链接到libgio-2.0.so,这是GLib(GLib,GObject,GIO)的第三部分。您可以使用pkg-config --cflags --libs gio-2.0pkg-config获取其编译器和链接器标志。

您可以通过查看文档 - 它位于GIO手册中:https://developer.gnome.org/gio/stable/GSocket.html,告诉GSocket在GIO中。

+0

谢谢。我知道GSocket在GIO中,但我认为Glib包含GObject和GIO。 – Sam

+2

没有,因为GIO是相当大的,故意将它们分开,并且许多使用GLib作为其基本数据结构的项目不希望GIO提供的功能更全面的I/O,网络和D-Bus支持。 GIO要求GLib和GObject。 GObject需要GLib。 GLib不需要另外两个。 –