Плохие зависимости Makefile и библиотеки?

Я хочу использовать некоторые классы opencv на моем gtkmm/glade/c++. После включения любого кода opencv он работает нормально, но если я добавлю opencv в библиотеки следующим образом: LIBS = 'pkg-config ... opencv --libs', приложение перестанет работать. В первой строке основного ( Gnome::Gda::init(); ) происходит сбой с ошибкой сегментации.

Makefile

LD = g++
LIBS = `pkg-config gtkmm-2.4 glibmm-2.4 libgdamm-4.0 --libs`
CPPFLAGS = `pkg-config gtkmm-2.4 glibmm-2.4 libgdamm-4.0 --cflags`

OBJS = main.o TreeviewImages.o MainWindow.o FormDialog.o DBUtil.o

all: build

build: $(OBJS)
    $(LD) $(LIBS) $(OBJS) -o cish

main.o: main.cpp
   g++ $(CPPFLAGS) -c main.cpp

MainWindow.o: MainWindow.cpp MainWindow.h DBUtil.h FormDialog.h
    g++ $(CPPFLAGS) -c MainWindow.cpp

TreeviewImages.o: TreeviewImages.cpp TreeviewImages.h
    g++ $(CPPFLAGS) -c TreeviewImages.cpp

FormDialog.o: FormDialog.cpp FormDialog.h DBUtil.h
    g++ $(CPPFLAGS) -c FormDialog.cpp

DBUtil.o: DBUtil.cpp DBUtil.h
    g++ $(CPPFLAGS) -c DBUtil.cpp

clean:
    rm -f cish $(OBJS)

Любое руководство/подсказка/помощь будет оценена по достоинству!


person wisuzu    schedule 06.12.2011    source источник
comment
Правильно ли я понимаю, что make завершается без ошибок, и при запуске происходит сбой полученного исполняемого файла? Тогда первое место, где я буду искать ошибку, будет не в make-файле, а в исходном коде C++.   -  person eriktous    schedule 07.12.2011


Ответы (1)


Это имеет большое значение, где размещать ваши библиотеки при компоновке.

Если у вас есть библиотека libexample, используя:

 g++ -lexample myprog2.o

не сможет загрузить библиотечные функции, если myprog2 ссылается на них.

Вместо этого используйте:

g++ myprog2.o -lexample 

То есть добавьте $(LIBS) после ссылки на объектные файлы.

person Milan    schedule 06.12.2011
comment
То есть изменить строку после build: на что-то вроде $(LD) $(OBJS) $(LIBS) -o cish - person Basile Starynkevitch; 07.12.2011
comment
Согласен, но если это неправильно, это приведет к ошибке на этапе связывания, верно? - person eriktous; 07.12.2011
comment
Я сделал то, что вы сказали, я перемещаю $ (LIBS) после $ (OBJS) и все еще выдает ошибку сегментации :( - person wisuzu; 07.12.2011