2013-03-29 1 views
5

Я пытаюсь сделать ссылку на статические версии LIBS РоКо C++, как это:POCO C++ статических задач соединяющихся с неопределенными ссылками на символы

g++ BCCMain.o -L$_POCO_LIBS -Wl,-Bstatic $_POCO_LIBS/libPocoFoundation.a $_POCO_LIBS/libPocoUtil.a $_POCO_LIBS/libPocoXML.a $_POCO_LIBS/libPocoJSON.a -Wl,-Bdynamic -o BCMain 

Unfortunatelly это дает ошибку о некоторых неопределенных ссылках на символы, как:

Poco::Logger::get(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) 

хотя Poco::Logger::get(std::string const&) фактически определено в libPocoFoundation.a.

Теперь, если я пытаюсь связать с общей версией фундамента Lib это работает:

g++ BCCMain.o -L$_POCO_LIBS -Wl,-Bstatic $_POCO_LIBS/libPocoFoundation.a $_POCO_LIBS/libPocoUtil.a $_POCO_LIBS/libPocoXML.a $_POCO_LIBS/libPocoJSON.a -Wl,-Bdynamic -lPocoFoundation -o BCMain 

Статические и общие версии LIBS имеют одни и те же символы, поэтому я считаю, что это трудно понять, что я делать неправильно.

Ubuntu/Linaro. g ++ 4.6.3

+0

Я также определил POCO_STATIC во время компиляции. Не помогло. – gregee123

ответ

1

Мне удалось решить эту проблему путем разделения компиляции и компоновки. Вот что мое выглядит следующим образом:

Compile: g++ -c -std=c++0x -ggdb -I/home/bbogart/src/of_v0071_linux64_release/libs/poco/include PKG-конфигурации OpenCV --cflags *.cpp

ссылка: g++ *.o -L/home/bbogart/src/of_v0071_linux64_release/libs/poco/lib/linux64/ -lPocoNet -lPocoUtil -lPocoFoundation -lopencv_gpu PKG-конфигурации OpenCV --libs -o cameraGrabber

Обратите внимание, что вам опустить имена «lib» и «.a» из lib.

14

Мой опыт в том, что порядок связывания библиотек Poco важен при статической привязке. Похоже, что Фондом является последний.

Порядок, который работает для меня:

  1. UTIL
  2. Net
  3. XML
  4. Фонд
+0

Gah! Спасибо, это было! – Cameron

+0

Да, статический порядок привязки с gcc важен, и необходимо учитывать внутренние зависимости между этими lib. Это не просто проблема POCO, но и общее поведение в статической компоновке gcc. В этом случае Util зависит от XML (вы можете проверить его в коде), например, и все библиотеки зависят от Foundation. На первом месте стоят независимые библиотеки, и требования этих библиотек должны быть после них. – drodri

+2

Также есть PocoJSON, который должен находиться между библиотеками Util и Net. – Bogolt

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