Ошибки компоновщика C ++, неопределенные ссылки на элементы, на которые следует ссылаться из общего объекта - PullRequest
4 голосов
/ 15 января 2010

Я строю библиотеку, называемую physgameengine, для помощи в создании игр. Эта игровая библиотека связана с несколькими библиотеками, включая: Ogre3d, Bullet Physics и SDL, которые находятся в файлах библиотеки libOgreMain-1.6.5.so, libBulletCollision.a, libBulletDynamics.a, libBulletSoftBody.a, libSDL-1.2.so.0 , Этот объект Library / Shared выглядит очень хорошо в Ubuntu 9.10, используя GCC и Code :: blocks. Он прекрасно работает на окнах с mingw и Code :: blocks.

В Windows я могу создавать игры, которые компилируют / связывают, используя библиотеку, которую я построил очень хорошо, эти программы работают и делают именно то, что я ожидаю. В Ubuntu, когда я пытаюсь скомпилировать / связать игру, которая использует эту библиотеку, я делаю, я получаю множество неопределенных ошибок ссылок. Но не к функциям или объектам в библиотеке, которую я построил, а к элементам, которые вызывает моя библиотека. Вот пример ошибок, которые я получаю.

> ||warning: libOgreMain-1.6.5.so, needed by ../physgameengine/bin/ubuntudebug/libphysgame.so, not found (try using -rpath or -rpath-link)|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Root::Root(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::StringUtil::BLANK'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btCollisionWorld::updateAabbs()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Root::createRenderWindow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned int, bool, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const*)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Timer::getMilliseconds()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Root::createSceneManager(unsigned short, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Root::~Root()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btCollisionWorld::~btCollisionWorld()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Root::renderOneFrame()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btCollisionObject::btCollisionObject()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Timer::getMillisecondsCPU()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btSimulationIslandManager::buildAndProcessIslands(btDispatcher*, btCollisionWorld*, btSimulationIslandManager::IslandCallback*)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Viewport::getActualWidth() const'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Root::initialise(bool, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Camera::lookAt(Ogre::Vector3 const&)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btCollisionWorld::removeCollisionObject(btCollisionObject*)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Viewport::getActualHeight() const'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Timer::reset()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Root::restoreConfig()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Timer::~Timer()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::NedAllocImpl::deallocBytes(void*)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btCollisionWorld::convexSweepTest(btConvexShape const*, btTransform const&, btTransform const&, btCollisionWorld::ConvexResultCallback&, float) const'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::NedAllocImpl::allocBytes(unsigned int, char const*, int, char const*)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `typeinfo for btCollisionWorld'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btCollisionObject::~btCollisionObject()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btSimulationIslandManager::btSimulationIslandManager()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Root::showConfigDialog()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btCollisionObject::setActivationState(int)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::LogManager::getSingleton()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btCollisionWorld::performDiscreteCollisionDetection()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::LogManager::logMessage(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Ogre::LogMessageLevel, bool)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Timer::Timer()'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btCollisionWorld::btCollisionWorld(btDispatcher*, btBroadphaseInterface*, btCollisionConfiguration*)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `typeinfo for btCollisionObject'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `Ogre::Camera::setPosition(Ogre::Vector3 const&)'|
../physgameengine/bin/ubuntudebug/libphysgame.so||undefined reference to `btCollisionWorld::addCollisionObject(btCollisionObject*, short, short)'|
||=== Build finished: 36 errors, 1 warnings ===|

Большая часть кода одинакова для Windows и Linux, они, кажется, имеют эквивалентные настройки компиляции / компоновщика. Но игра для Linux, похоже, связана с исходными библиотеками, с которыми должна связываться моя библиотека. Что здесь происходит? Любые идеи о том, как это исправить?

Ответы [ 4 ]

3 голосов
/ 15 января 2010

Самая первая строка вашей ошибки говорит вам о проблеме:

libOgreMain-1.6.5.so, needed by libphysgame.so, not found (try using -rpath or -rpath-link)|

Вам необходимо указать каталог, в котором установлен libOgreMain. Поскольку вам нужно использовать опцию компоновщика, вам нужно использовать функцию -Wl в gcc. Предполагая, что файлы находятся в / opt / lib, вы должны добавить:

gcc -Wl,-rpath-link,/opt/lib ...rest of linker line...
3 голосов
/ 15 января 2010

В отличие от Windows, в системах Linux недостаточно поместить файл общей библиотеки в ту же папку, что и исполняемый файл.

Вы должны либо предоставить LD_LIBRARY_PATH переменную, либо следовать совету компоновщика и использовать -rpath (отметьте этот вопрос )

2 голосов
/ 15 января 2010

Только на основании первой строки:

> ||warning: libOgreMain-1.6.5.so, needed by ../physgameengine/bin/ubuntudebug/libphysgame.so, not found (try using -rpath or -rpath-link)|

Похоже, у вашего компоновщика проблемы с поиском вашего общего объекта. Убедитесь, что пути включения вашего компоновщика установлены правильно.

1 голос
/ 25 марта 2015

Это хорошая ссылка на тему http://sysprogs.com/w/fixing-rpath-link-issues-with-cross-compilers/

По сути, если у вас нет -lmylib для всех ваших библиотек, на которые вы ссылаетесь, вы не можете рассчитывать на -Lpath, чтобы найти их. Таким образом, если /opt/infoa/lib/liba.so зависит от /opt/infod/lib/libd.so и вы указываете только -la, то вам нужно что-то вроде этого:

gcc -Wl, -rpath-link, / opt / infod / lib -L / opt / infoa / lib -la * .c -o myexec

...