Problemas con el linker

Iniciado por El_Java, 2 Julio 2012, 17:25 PM

0 Miembros y 1 Visitante están viendo este tema.

El_Java

Hola a todos.
He estado instalando las librerias Ogre3D y todas las inmensas dependencias que tiene esta librería gráfica, al final del proceso traté de compilar un código de prueba y no he podido. El problema está en el linker ya que me da diversos errores del tipo "Undefined reference to...".
No es la primera vez que tengo problemas con el linker, así que lo que hice fue añadir la ruta de las librerias al linker para que las encontrase, lo hice con las de Ogre (que había instalado directamente desde el codigo fuente). Pero luego también tuve que hacerlo con la libreria OIS (la cual había instalado mediante los repositorios de Ubuntu, ya sabeis: sudo apt-get install ___), y eso ya me empezó a mosquear. Ahora me dice que el linker tampoco encuentra las librerias de X11 y ya empiezo a pensar que el problema puede estar en el linker, porque no son normales tantos problemas....

¿Alguna idea?

Un saludo

Foxy Rider

#1
¿Qué te sale en las undefined reference? por otro lado MUY MAL eso de instalar manualmente ... ya que esa instalación vá a dejar residuos que pueden corromper lo que el gestor de paquetes o futuras instalaciones manuales puedan agregar.
Si todavía tenés el Makefile desde el que corriste el make install, corré make uninstall (o deinstall, siempre se me transpapela en la cabeza) y forzá re-instalación de los paquetes de Ogre y OIS (los -dev también) vía gestor de paquetes.

Compilá este código (que es un código MÍNIMO de Ogre) : http://foro.elhacker.net/programacion_cc/ogre3d_en_dev_c-t243920.0.html;msg1173366#msg1173366  ←Qué asco ese código, se hace el agnóstico de la plataforma cuando no lo es !! x')
Pero usando g++ directamente

Código (bash) [Seleccionar]
g++ -lOgre Fichero.cpp # u -lOgreMain si esto no funciona

Si compila, la instalación y el linker está bien ... estás configurando mal el proyecto

Saludos.

El_Java

Gracias por la ayuda, he borrado y reinstalado las librerias de la manera que tu me has dicho y he conseguido que me compile varios codigos de ese post sin problemas usando:
Código (bash) [Seleccionar]
g++ -lOgreMain Fichero.cpp
Pero luego he intentado ejecutar el archivo para ver como funciona y me da un error Ogre3d, te lo copio aqui:
Loading library RenderSystem_Direct3D9
terminate called after throwing an instance of 'Ogre::InternalErrorException'
  what():  OGRE EXCEPTION(7:InternalErrorException): Could not load dynamic library RenderSystem_Direct3D9.  System Error: RenderSystem_Direct3D9.so: cannot open shared object file: No such file or directory in DynLib::load at /build/buildd/ogre-1.7.4/OgreMain/src/OgreDynLib.cpp (line 91)
Abortado (`core' generado)


¿Cuál puede ser el problema? He cambiado para que cargase OpenGl pero el fallo ha sido similar...

Foxy Rider

#3
Todo en orden entonces, ese código es un horror, por que no es portable para nada (es esperable que falle, por que está programado para preferir Direct3D en una plataforma donde no existe) ... en esos oscuros tiempos programaba sólo sobre Windows (principalmente por el Cg studio y otras tools que ahora reemplazé) , y como deducirás, sobre Visual Studio.
Ahora, si tuviese que reformularte ese post y código para que testees Ogre, lo haría así:

Como uso Debian y no quiero poner el path completo a RenderSystem_GL, simplemente le hago un enlace simbólico en el directorio actual, en mi caso:

Código (bash) [Seleccionar]
ln -s /usr/lib/x86_64-linux-gnu/OGRE-1.7.4/RenderSystem_GL.so ./

Test.cxx
Código (cpp) [Seleccionar]
#include <Ogre.h>

#define RENDERSYSTEM_GL "./RenderSystem_GL"
#define RENDERSYSTEM_GL_NAME "OpenGL Rendering Subsystem"

int main(int argc, char *argv[])
{
Ogre::Root* Root = new Ogre::Root("",""); // omitimos el archivo de plugin y config

Root->loadPlugin(RENDERSYSTEM_GL);

// Tomemos OpenGL como preferido ...
Ogre::RenderSystem* RenderSystem  = Root->getRenderSystemByName(RENDERSYSTEM_GL_NAME);

// Seteemos el RenderSystem
Root->setRenderSystem(RenderSystem);
// Inicializemos el RenderSystem sin crear una ventana de render
Root->initialise(false);

// Creemos la ventana de render a 800x600 Windowed mode
Ogre::RenderWindow* Window = Root->createRenderWindow("Ejemplo",800,600,false);

// Listo, Tenemos Una Aplicación Ogre Inicializada =3
// Creemos lo básico para una escena

Ogre::SceneManager* SceneMgr = Root->createSceneManager(Ogre::ST_GENERIC); // Esto del Type mask se desaconseja ! ~ un Scene Manager Basico
Ogre::Camera* Cam = SceneMgr->createCamera("MainCamera");  // Creamos una camara
Ogre::Viewport* Vp = Window->addViewport(Cam); // Un viewport en la ventana Window, usando Cam como origen desde donde se va a renderizar

// Listo, Inicializado
// Entremos en un bucle de render infinito ....

Root->startRendering();
delete Root; // es lo mismo, total, está el return, pero igual lo pongo

return 0;

}


Código (bash) [Seleccionar]
clang++ -lOgreMain Test.cxx -I/usr/include/OGRE -o ./Test #g++ o loquesea, la cosa es compilar, pasar librería y que encuentre el header
Con eso testeás que la app. se compile y ejecute, aunque en tu caso ya compiló, significa que está todo ok mientras tengas la aceleración funcionando.

Ahora, si me pedís la respuesta "correcta", no inicializaría así a Ogre, sino más bien usaría ayuda de cmake para armar un módulo que lidie con tema encabezados y librerías de forma portable a través de las plataformas, si bien puede hacerse con un IDE portable como Code::Blocks, los paths no siempre son los mismos (cmake lidia con eso) ... sobre eso algún script (guarda con el sentido en el que lo uso !!!) de inicialización que lidie con todas estas cochinadas de los plugins, rendersystems y demás temas de inicialización de forma elegante...

Saludos.