Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas con librerias shared y namespaces

Iniciado por nsL, 27 de Junio de 2007, 06:48:55 PM

« anterior - próximo »

nsL

Hola :)

Estoy teniendo problemas en el trabajo debido a una serie de circunstancias. La situacion en la siguiente:

Estoy haciendo una libreria grafica dinamica (.so) en linux y tengo problemas a la hora de exportar ciertas funciones. Estoy organizando todo por espacios de nombres (namespaces) y me es imposible acceder a ellas desde un programa q use dicha libreria.

A modo de resumen supongamos que tengo una estructura asi:

principal.cpp
---------

#include "principal.hpp"

namespace nm
{
   int func1()
   {
       return 8;
    }
}


y tengo su cabecera correspondiente:

principal.hpp
--------------

namespace nm
{
     int func1();
}


Con esto genero la libreria dinamica libGraph.so (por ejemplo)

En otro proyecto intento hacer un ejecutable usando dicha libreria:

main.cpp
----------

#include "principal.hpp"

using namespace nm;

int main()
{
  int Variable = func1();
}


Y por supuesto enlazo dicha libreria y añado principal.hpp al proyecto.

Pues con todo esto me dice q no esta definida nm::func1().

El caso es q con funciones q no estan dentro de ningun espacio de nombres se exportan perfectamente. ¿Alguna sugerencia de que estoy haciendo mal?
No soy mucho de namespaces y lo mismo se me esta pasando algo por alto.

Saludos y gracias de mano :):)
Yo no muero hasta la muerte -

Prompt

Como exportas las funciones de esa librería?

Así a pelo incluyendo el .h no se puede, a no ser que lo tengas en otro fichero.

Prompt

Puedes hacer mmm algo asi:


//*------------------------------------------------------------------------------------------------
//!  \file defineLink.h
//!  \brief    Dynamic and Static macros
//!  \author Prompt
//!  \date    28/06/2007
//*------------------------------------------------------------------------------------------------
//! \defgroup Core_Macros Macros
//! \brief Core helper macros for nsL
//!
//! \ingroup Core
//_________________________________________________________________________________________________

#pragma once

/// \addtogroup Core_Macros
//!@{
//! Dynamic Link
#ifdef DYNAMIC_LINK

#ifdef _WIN32
   #define DllImport extern __declspec( dllimport )
   #define DllExport extern __declspec( dllexport )
#else
  #define DllImport extern
  #define DllExport extern
#endif

//! Static Link
#else

  #define DllImport
  #define DllExport

#endif
//!@}



#include "defineLink.h"
#pragma once

//*------------------------------------------------------------------------------------------------
namespace miNameSpace
{

   DllExport int exportateWarrah() { return -1; }

}


En linux con extern basta.
Revisalo pq ni lo he compilado y es muy temprano ... :D

nsL

Cita de: "Prompt"Como exportas las funciones de esa librería?

Así a pelo incluyendo el .h no se puede, a no ser que lo tengas en otro fichero.

Uso el .h para los prototipos de las funciones y la libreria .so (.dll en windows) para su cuerpo.

De todas formas acabo de llegar al curro. Voy a probar eso q me comentas a ver q sale :

Gracias por responder !
Yo no muero hasta la muerte -

nsL

vale, ya funciona :)

Al final no hizo falta ni usar extern, solo habia que hacer las cosas bien xDD

Es que estoy usando KDevelop, que en vez de makefile usa CMake (aunq este usa makefile tb), y no tenia bien configurado el proyecto y no me estaba compilando los .cpp xDDDDD

Por si alguien le pasa lo mismo aqui va una configuracion con cmake para una libreria shared:


SET(DispLib_LIB_SRCS
       ${CMAKE_SOURCE_DIR}/src
)

ADD_LIBRARY (Displayer SHARED
${DispLib_LIB_SRCS}/Display.cpp
${DispLib_LIB_SRCS}/main.cpp
${DispLib_LIB_SRCS}/ModeManager.cpp
)

TARGET_LINK_LIBRARIES ( Displayer
glut
dl
)

set_target_properties(Displayer PROPERTIES LINKER_LANGUAGE CXX)


Lo que estaba haciendo mal era que en ADD_LIBRARY estaba añadiendo el path de los .cpp en vez de los .cpp en si :(

Gracias de todas formas por las respuestas, porq he visto que se usa mucho eso de extern en estos casos y quizas deba añadirlo para evitar futuros problemas :)

Saludos!
Yo no muero hasta la muerte -






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.