Usar clases de C++ en bibliotecas.so
linux class-library (3)
Intento escribir una pequeña biblioteca de clase para un curso de C ++.
Me preguntaba si era posible definir un conjunto de clases en mi objeto compartido y luego usarlas directamente en mi programa principal que muestra la biblioteca. ¿Hay algún truco involucrado? Recuerdo haber leído esto hace mucho tiempo (antes de comenzar a programar realmente) que las clases de C ++ solo funcionaban con archivos DLL de MFC y no simples, pero eso es solo el lado de Windows.
Según tengo entendido, esto está bien siempre y cuando estés vinculando .so archivos que fueron compilados todos utilizando el mismo compilador. Los diferentes compiladores destruyen los símbolos de diferentes maneras y no logran vincularlos.
Esa es una de las ventajas de usar COM en Windows, define un estándar para colocar objetos OOP en DLL. Puedo compilar un DLL usando GNU g ++ y vincularlo a un EXE compilado con MSVC - ¡o incluso VB!
Mi solución / prueba
Aquí está mi solución y hace lo que esperaba.
Código
cat.hh :
#include <string>
class Cat
{
std::string _name;
public:
Cat(const std::string & name);
void speak();
};
cat.cpp :
#include <iostream>
#include <string>
#include "cat.hh"
using namespace std;
Cat::Cat(const string & name):_name(name){}
void Cat::speak()
{
cout << "Meow! I''m " << _name << endl;
}
main.cpp :
#include <iostream>
#include <string>
#include "cat.hh"
using std::cout;using std::endl;using std::string;
int main()
{
string name = "Felix";
cout<< "Meet my cat, " << name << "!" <<endl;
Cat kitty(name);
kitty.speak();
return 0;
}
Compilacion
Primero compila la biblioteca compartida:
$ g++ -Wall -g -fPIC -c cat.cpp
$ g++ -shared -Wl,-soname,libcat.so.1 -o libcat.so.1 cat.o
Luego compila el ejecutable principal o el programa C ++ usando las clases en las bibliotecas:
$ g++ -Wall -g -c main.cpp
$ g++ -Wall -Wl,-rpath,. -o main main.o libcat.so.1 # -rpath linker option prevents the need to use LD_LIBRARY_PATH when testing
$ ./main
Meet my cat, Felix!
Meow! I''m Felix
$
Las clases de C ++ funcionan bien en .so bibliotecas compartidas (también funcionan en DLL que no son MFC en Windows, pero esa no es realmente su pregunta). En realidad es más fácil que Windows, porque no tiene que exportar explícitamente ningún símbolo de las bibliotecas.
Este documento responderá la mayoría de sus preguntas: http://people.redhat.com/drepper/dsohowto.pdf
Las principales cosas que debe recordar son usar la opción -fPIC
al compilar y la opción -shared
al enlazar. Puedes encontrar muchos ejemplos en la red.