2012-04-18 1 views
3

Моего проекта зависит от библиотеки (точнее, GTK +), поэтому я добавил следующие конфигурации в моем configure.ac:Autoconf сгенерированных Makefile не проходит флаги для библиотеки заголовков при использовании PKG_CHECK_MODULES

PKG_CHECK_MODULES([GTK], [gtk+-2.0]) 
AC_SUBST([GTK_CFLAGS]) 
AC_SUBST([GTK_LIBS]) 

Моего Makefile.am является:

bin_PROGRAMS = secretary 
secretary_SOURCES = secretary.c 

в свою очередь, мой secretary.c выглядит следующим образом:

#include <gtk/gtk.h> 

int main(int argc, char *argv[]) { 
    gtk_init(&argc, &argv); 
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_widget_show(window); 
    gtk_main(); 
    return 0; 
} 

Однако, когда я бегу make (конечно, после вызова ./configure) Я получил эту ошибку:

gcc -DHAVE_CONFIG_H -I.  -g -O2 -MT secretary.o -MD -MP -MF .deps/secretary.Tpo -c -o secretary.o secretary.c 
secretary.c:1:21: fatal error: gtk/gtk.h: File or directory not found. 

Что мне не хватает? Почему autoconf не передает правильные флаги в gcc?

+1

Вы не должны '' AC_SUBST' GTK_CFLAGS' и 'GTK_LIBS' как' PKG_CHECK_MODULES' уже делает это для вас. –

ответ

2

Когда вы используете PKG_CHECK_MODULES, вам нужно указать флаги в Makefile.am. Самый простой способ, чтобы добавить его в AM_LDFLAGS и AM_CPPFLAGS:

AM_LDADD = @[email protected] 
AM_CPPFLAGS = @[email protected] 

Если вы хотите быть более конкретным, вы можете вместо этого добавить:

secretary_LDADD = @[email protected] 
secretary_CPPFLAGS = @[email protected] 

Это, вероятно, проще не использовать PKG_CHECK_MODULES вообще и позвольте пользователю указать расположение библиотек с помощью обычного механизма (назначение LDFLAGS или установка библиотек в стандартном местоположении).

+2

-1, потому что ваше предложение не использовать PKG_CHECK_MODULES ошибочно. Вы можете указать другое местоположение, изменив PKG_CONFIG_PATH другими способами. – elmarco

+1

@elmarco PKG_CHECK_MODULES имеет много проблем, и подавляющее большинство опытных пользователей autotool (т. Е. Объявления разработчиков в списках обслуживания autotool) препятствуют его использованию. Этот конкретный вопрос является одним из отличных примеров того, почему это плохая идея: он требует, чтобы сопровождающий пакет добавлял дополнительный треск в Makefile.am, и он обеспечивает нулевую выгоду. Ваше предложение о том, чтобы пользователь указал PKG_CONFIG_PATH, не затрагивает проблему, возникшую в этом вопросе, и сборка все равно будет терпеть неудачу, если не будет изменен Makefile.am. –

+0

Я не предлагаю решение, я указал, что вы сказали, что это неверно или вводит в заблуждение. Было бы интересно, если бы вы могли указать мне на обсуждение списка рассылки, где разработчики фактически препятствуют использованию PKG_CHECK_MODULES в пользу того, чтобы пользователи давали все флаги вручную. – elmarco

2

Начиная с предложения @William Pursell, я искал решение. Этот ответ несколько подробный, потому что я чувствую необходимость обосновать, почему я не принимаю эту полезную должность в качестве ответа.

Примечание: Если вы ищете магические линии, просто перейдите в раздел «Решение» в конце.

Попытка предложенное решение

Я попытался решение Уильям Перселл, но нашел проблему: GCC 4.6.1 специально требуя при работе с упорядочением некоторых параметров. Поэтому, когда я установить переменные, как показано ниже:

secretary_CPPFLAGS = @[email protected] # DOES NOT WORK! 
secretary_LDFLAGS = @[email protected] # DOES NOT WORK! 

я получил следующее gcc вызова строки:

gcc -std=gnu99 -g -O2 -pthread -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 \ 
    -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 \ 
    -lfreetype lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt \ 
    -lglib-2.0 -o secretary secretary-secretary.o 

где библиотеки передаются компилятору перед код .o объекта. НКУ не принял его и дал мне эту ошибку:

secretary-secretary.o: In function `main': 
/home/adam/software/secretary-gtk/secretary.c:4: undefined reference to `gtk_init' 
/home/adam/software/secretary-gtk/secretary.c:5: undefined reference to `gtk_window_new' 
/home/adam/software/secretary-gtk/secretary.c:6: undefined reference to `gtk_widget_show' 
/home/adam/software/secretary-gtk/secretary.c:7: undefined reference to `gtk_main' 

следующие исследования

ищет решение, я обнаружил, что @ uidzer0 было the same problem и решить ее - но не опубликовать подробное объяснение ... Поэтому я пошел посмотреть на his project.Я смотрел на его configure.ac, где я нашел использование PKG_CHECK_MODULES:

PKG_CHECK_MODULES([FUSE], [fuse >= 2.8.3]) 
PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.22.5]) 
PKG_CHECK_MODULES([GTHREAD], [gthread-2.0]) 
PKG_CHECK_MODULES([CURL], [libcurl >= 7.16.0]) 

Так что я искал, где были использованы сгенерированные переменные (FUSE_LIBS и т.д.). Я нашел их в файле src/Makefile.am:

stormfs_CFLAGS = -D_REENTRANT \ 
       -DFUSE_USE_VERSION=26 \ 
       -D_FILE_OFFSET_BITS=64 \ 
       -DSYSCONFDIR=\"${sysconfdir}\" \ 
       ${FUSE_CFLAGS} \ 
       ${CURL_CFLAGS} \ 
       ${GLIB_CFLAGS} \ 
       ${GTHREAD_CFLAGS} 
stormfs_LDADD = ${LIBS} \ 
       ${FUSE_LIBS} \ 
       ${CURL_LIBS} \ 
       ${GLIB_LIBS} \ 
       ${GTHREAD_LIBS} 

Решение

Так я заключаю я должен установить не в *_CPPFLAGS/*_LDFLAGS но вместо *_CFLAGS и *_LDADD флагов. Мой результат (рабочая) конфигурация, то есть:

bin_PROGRAMS = secretary 
secretary_SOURCES = secretary.c 
secretary_CFLAGS = @[email protected] 
secretary_LDADD = @[email protected] 
+2

Arghh. Я не могу поверить, что сделал такую ​​простую ошибку. Конечно, аргументы -l принадлежат LDADD! Не уверен, что я могу действительно сделать этот аргумент, но я буду считать это еще одним моментом против PKG_CHECK_MODULES. –

+0

Ну, в этом случае вы все равно дали правильный ответ :), так что это будет принято. – brandizzi

 Смежные вопросы

  • Нет связанных вопросов^_^