g_socket_new 的 Glib 链接错误

Sun*_*nny 0 gobject glib gio

我正在尝试为网络项目学习 glib 和 gObject。

这是用于编译的命令(使用 pkg-config 获取输出后):

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
Run Code Online (Sandbox Code Playgroud)

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);

 }
Run Code Online (Sandbox Code Playgroud)

错误是:

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

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

Phi*_*all 6

您需要链接到libgio-2.0.so,这是 GLib(GLib、GObject、GIO)的第三部分。您可以pkg-config使用pkg-config --cflags --libs gio-2.0.

您可以GSocket通过查看文档来判断是在 GIO 中——它在 GIO 手册中:https : //developer.gnome.org/gio/stable/GSocket.html

  • 不,它们是故意分开的,因为 GIO 非常大,并且许多使用 GLib 作为其基本数据结构的项目不想要 GIO 提供的功能更齐全的 I/O、网络和 D-Bus 支持。GIO 需要 GLib 和 GObject。GObject 需要 GLib。GLib 不需要其他两个。 (2认同)