(C++) glibmm не будет ссылаться на Ubuntu/Oneiric
У меня проблемы с звонком самой простой программы на Ubuntu/Oneiric:
#include <glibmm/ustring.h>
int main()
{
Glib::ustring s = "Test string";
}
используя Makefile
PACKAGES=glibmm-2.4 glib-2.0 gtkmm-3.0 gtk+-3.0
CC=g++
CFLAGS=`pkg-config --cflags $(PACKAGES)` --std=c++0x
LD=g++
LDFLAGS=`pkg-config --libs $(PACKAGES)`
build: ./main
run: build
./main
clean:
rm ./main.o
rebuild: clean build
./main: ./main.o
$(LD) $(LDFLAGS) ./main.o -o ./main
./main.o: ./main.cc
$(CC) $(CFLAGS) ./main.cc -c -o ./main.o
На make появляются следующие ошибки:
./main.o: In function `main':
main.cc:(.text+0x15): undefined reference to `Glib::ustring::ustring(char const*)'
main.cc:(.text+0x21): undefined reference to `Glib::ustring::~ustring()'
collect2: ld returned 1 exit status
make: *** [main] Error 1
В Ubuntu/Maverick точно такой же код хорошо связывается с точно таким же файлом... при использовании ld на main.o он тоже успешно связывается, но (как и ожидалось) _start отсутствует...
Какие-либо предложения?
1 ответ
Попробуйте изменить соответствующие строки на это:
LDFLAGS=`pkg-config --libs-only-L --libs-only-other $(PACKAGES)`
LIBS=`pkg-config --libs-only-l $(PACKAGES)`
# ...
./main: ./main.o
$(LD) $(LDFLAGS) ./main.o -o ./main $(LIBS)
Причина в том, что компоновщик может искать библиотеки в том порядке, в котором они указаны в командной строке, поэтому они всегда должны быть расположены последними, чтобы быть безопасными.