Проблемы статического связывания poco 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

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

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

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

Теперь, если я попытаюсь связать с общей версией базовой библиотеки, она сработает:

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

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

Убунту/Линаро. г++ 4.6.3


person gregee123    schedule 29.03.2013    source источник
comment
Я также определил POCO_STATIC при компиляции. Не помогло.   -  person gregee123    schedule 29.03.2013


Ответы (2)


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

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

  1. Утилита
  2. Сеть
  3. XML
  4. Фундамент
person i_papp    schedule 15.10.2013
comment
Гах! Спасибо, это было! - person Cameron; 08.12.2014
comment
Да, статический порядок компоновки с gcc важен, и необходимо учитывать внутренние зависимости между этими библиотеками. Это не просто проблема POCO, а общее поведение при статической компоновке gcc. В этом случае Util зависит от XML (это можно проверить в коде), например, а все библиотеки зависят от Foundation. Независимые библиотеки идут первыми, а требования этих библиотек должны быть после них. - person drodri; 28.08.2015
comment
Также есть PocoJSON, который должен быть между библиотеками Util и Net. - person Bogolt; 17.04.2016

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

Скомпилируйте: g++ -c -std=c++0x -ggdb -I/home/bbogart/src/of_v0071_linux64_release/libs/poco/includepkg-config opencv --cflags*.cpp

ссылка: g++ *.o -L/home/bbogart/src/of_v0071_linux64_release/libs/poco/lib/linux64/ -lPocoNet -lPocoUtil -lPocoFoundation -lopencv_gpupkg-config opencv --libs-o cameraGrabber

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

person b..    schedule 01.08.2013