(C ++) glibmm не будет ссылаться на Ubuntu / Oneiric - PullRequest
1 голос
/ 24 января 2012

У меня проблемы с вызовом самой простой программы в 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

при появлении следующих ошибок:

./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 Ответ

2 голосов
/ 24 января 2012

Попробуйте изменить соответствующие строки следующим образом:

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)

Причина в том, что компоновщик может искать библиотеки в порядке, указанном в командной строке, поэтому они всегда должны быть последними в безопасном месте..

...