Простая программа libnotify «привет, мир» не удается скомпилировать в Ubuntu 20.04 с ошибкой компоновщика

#c #ubuntu #libnotify

#c #ubuntu #libnotify

Вопрос:

Я, вероятно, упускаю здесь что-то очень простое, но по какой-то причине я не могу успешно подключиться к libnotify в своей системе Ubuntu 20.04, хотя все установлено правильно и pkg-cfg (IMHO) возвращает правильные параметры… есть какие-нибудь идеи ?

 user@home:~/jabrac$ ldconfig -v | grep notify   libnotify.so.4 -gt; libnotify.so.4.0.0  user@home:~/jabrac$ dpkg -L libnotify-dev  /. /usr /usr/include /usr/include/libnotify /usr/include/libnotify/notification.h /usr/include/libnotify/notify-enum-types.h /usr/include/libnotify/notify-features.h /usr/include/libnotify/notify.h /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/pkgconfig /usr/lib/x86_64-linux-gnu/pkgconfig/libnotify.pc /usr/share /usr/share/doc /usr/share/doc/libnotify-dev /usr/share/doc/libnotify-dev/copyright /usr/share/gir-1.0 /usr/share/gir-1.0/Notify-0.7.gir /usr/lib/x86_64-linux-gnu/libnotify.so /usr/share/doc/libnotify-dev/changelog.Debian.gz user@home:~/jabrac$ ls -l /usr/lib/x86_64-linux-gnu/libnotify.so* lrwxrwxrwx 1 root root 14 Mär 20 2020 /usr/lib/x86_64-linux-gnu/libnotify.so -gt; libnotify.so.4 lrwxrwxrwx 1 root root 18 Mär 20 2020 /usr/lib/x86_64-linux-gnu/libnotify.so.4 -gt; libnotify.so.4.0.0 -rw-r--r-- 1 root root 38984 Mär 20 2020 /usr/lib/x86_64-linux-gnu/libnotify.so.4.0.0  user@home:~/jabrac$ cat hello_world.c  #include lt;libnotify/notify.hgt; #include lt;stdio.hgt;  int main(int argc, char * argv[] )  {  notify_init("Sample");  NotifyNotification* n = notify_notification_new ("Hello world",   "some message text... bla bla",  0);  notify_notification_set_timeout(n, 10000); // 10 seconds   if (!notify_notification_show(n, 0))   {  printf("show has failedn");  return -1;  }  return 0; } user@home:~/jabrac$ gcc `pkg-config --cflags --libs libnotify` hello_world.c  /usr/bin/ld: /tmp/cckbaX1n.o: in function `main': hello_world.c:(.text 0x1b): undefined reference to `notify_init' /usr/bin/ld: hello_world.c:(.text 0x33): undefined reference to `notify_notification_new' /usr/bin/ld: hello_world.c:(.text 0x48): undefined reference to `notify_notification_set_timeout' /usr/bin/ld: hello_world.c:(.text 0x59): undefined reference to `notify_notification_show' collect2: error: ld returned 1 exit status  user@home:~/jabrac$ pkg-config --cflags --libs libnotify -pthread -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lnotify -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0  

Комментарии:

1. При сборке важен порядок файлов и библиотек в командной строке! Библиотеки должны следовать за исходными и объектными файлами.

2. ^ — вот ответ. Вы можете проверить с помощью nm-D /usr/lib/x86_64-linux-gnu/libnotify.so.4, что символ действительно экспортирован. Напишите файл Makefile вместо того, чтобы делать это в командной строке. Это сэкономит вам массу времени. В вашем файле Makefile вызовите pkg-config с помощью $(оболочка pkg-config…), чтобы вы могли видеть, что делает ваша командная строка. В этом случае pkg-config —libs libnotify возвращает ожидаемый-lnotify.

Ответ №1:

Как сказал @Someprogrammerdude выше, вам нужно указать параметры-l после вашей программы. Вот соответствующий раздел справочной страницы gcc(1) :

-llibrary

Имеет значение, где в команде вы пишете этот параметр; компоновщик выполняет поиск и обработку библиотек и объектных файлов в указанном порядке. Таким образом, foo.o-lz bar.o ищет библиотеку z после файла foo.o, но до bar.o. Если bar.o ссылается на функции в z, эти функции могут не загружаться.

Комментарии:

1. Большое вам спасибо, @Какой-то чувак-программист и Аллан Винд …. Не будучи программистом на Си, я знал, что это должно было быть что-то очень простое 😉