/dev/random писал: ↑02.05.2025 07:52
жучара писал(а): ↑02.05.2025 03:04
warning: implicit declaration of function ‘g_fopen’
Вы не включили заголовки от glib, только от gtk.
Upd: по приведённой вами же ссылке:
GLib.fprintf писал(а):glib/gprintf.h must be explicitly included in order to use this function.
А для g_fopen, насколько я помню, нужен
glib/gstdio.h
Upd2: вообще, когда вы видите "implicit declaration", это значит вы либо опечатались в имени функции (не в вашем случае), либо забыли подключить какой-то заголовочник.
Понятно. Обошёлся пока
#include <glib/gstdio.h> Что же даёт
#include <glib/gstdio.h>?
Код тот же, команда компиляции та же
1)
НЕ ИСПОЛЬЗУЕМ #include <glib/gstdio.h>:
Shell
$ nm a.out | grep "U "
U g_fopen
U g_fprintf
U __libc_start_main@GLIBC_2.34
$
2)
ИСПОЛЬЗУЕМ #include <glib/gstdio.h>:
Shell
$ nm a.out | grep "U "
U fopen@GLIBC_2.2.5
U g_fprintf
U __libc_start_main@GLIBC_2.34
$
То есть
g_fopen подменяется на
fopen@GLIBC_2.2.5 и это действительно всё решает. Удивительным образом решает. Итак,
1)
ИСПОЛЬЗУЕМ #include <glib/gstdio.h>, компилим, командуем:
Shell
$ rm foo.txt && ./a.out
$
$ cat foo.txt
Hello, world!
$
Всё хорошо.
1)
НЕ ИСПОЛЬЗУЕМ #include <glib/gstdio.h>, компилим, командуем:
Shell
$ rm foo.txt && ./a.out
Ошибка сегментирования
$
$ cat foo.txt
$
Не хорошо, но удивительно. Проблемная функция
g_fopen СОЗДАЁТ ТАКИ файл
foo.txt, но
g_fprintf записать в него ничего не может. Видать
g_fopen не даёт ей этого сделать потому, что
g_fopen и вправду проблемная.
...В код
g_fopen я не полез, но посмотрел, где она есть. Для этого убрал из командной строки опцию
-lglib-2.0 и помимо предупреждений всяких при компиляции получил такое:
Shell
...
/usr/bin/ld: /tmp/cc4y0BeH.o: в функции «main»:
main.c:(.text+0x22): неопределённая ссылка на «g_fopen»
/usr/bin/ld: main.c:(.text+0x43): неопределённая ссылка на «g_fprintf»
collect2: error: ld returned 1 exit status
...
То есть тело
g_fopen и
g_fprintf присутствуют в файле
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7400.6 (как я до него добрался- кто в теме, тот поймёт). И первая так написана, что её аж необходимо заменять.
Тот факт, что функция
g_fopen есть в файле
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7400.6 даёт нам понять, почему при компиляции нет ошибок линковщика- их и вправду нет. Линковщик просто проверяет наличие функций, а уж как они работают- дело десятое для него.
Я просто читаю маны.