我有以下 Config.cfg
[Power]
Power8=8
Temp=5=1001
Hum=7=1002
Link=8=1003
Vol=9=1004
[Power]
Power10=10
Temp=5=1012
Hum=7=1013
Link=8=1014
Vol=9=1015
Run Code Online (Sandbox Code Playgroud)
通过使用 glib,我想读取每个 Power 的值。我想要类似“如果 Power8=8 则返回 temp、hum、Link、Vol”的内容,否则 Power10=10 的情况相同
我写了这个函数
int read_config()
{
GKeyFile *keyfile;
GKeyFileFlags flags;
GError *error = NULL;
gsize length;
gchar *temperatura, *humedad, *link, *voltage;
// Create a new GKeyFile object and a bitwise list of flags.
keyfile = g_key_file_new ();
flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
// Load the GKeyFile from keyfile.conf or return.
if (!g_key_file_load_from_file (keyfile, "/home/pi/Desktop/Config.cfg", flags, &error))
{
g_error (error->message); …Run Code Online (Sandbox Code Playgroud) 我正在尝试为网络项目学习 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 -Ws 和nm来查看是否可以在链接的任何 .so 文件中看到 g_new_socket 。我没有看到任何。我需要链接到一个单独的图书馆吗?它在哪里/哪个?
我在做的油嘴一些严重的软件。我意识到有些主题我不太了解。IRC也无济于事...
当我们进行继承时,我们可以有两个类。第一个A直接从GObject继承,B直接从A继承。然后我来到这里:
https://developer.gnome.org/gobject/stable/chapter-gobject.html
static void
viewer_file_constructed (GObject *obj)
{
/* update the object state depending on constructor properties */
/* Always chain up to the parent constructed function to complete object
* initialisation. */
G_OBJECT_CLASS (viewer_file_parent_class)->constructed (obj);
}
static void
viewer_file_class_init (ViewerFileClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructed = viewer_file_constructed;
}
Run Code Online (Sandbox Code Playgroud)
但是,当你有这样的安排。子类执行此操作:object_class-> constructed = viewer_file_constructed; 实际上,在B覆盖中唯一构造的内存地址。因此,这意味着G_OBJECT_CLASS(viewer_file_parent_class)-> constructed(obj); 将调用B->递归构成。这不是我们想要的。
也许我听不懂,但我想B中的内存结构是这样的:
struct _B
{
A parent_instance;
/* instance members */
};
Run Code Online (Sandbox Code Playgroud)
内部表示应类似于:
[ Gobject struct memory ]
[ ]
[ …Run Code Online (Sandbox Code Playgroud) 我正在使用g_object_set_dataevent_box设置用户名,所以在回调中我可以在event_box指针中获取它.
g_object_set_data(G_OBJECT(event_box), "user_name", (gpointer)(user_name) );
Run Code Online (Sandbox Code Playgroud)
但问题是我设置的user_name不是指针分配的字符串.
它是一个本地字符串(未在臀部分配)被破坏.
所以有必要分配然后使用指针,我只想将一个名称与此event_box关联.