Pregunta

Estoy intentando escribir una pequeña biblioteca de clases 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 con los simples, pero eso es solo el lado de Windows.

¿Fue útil?

Solución

Las clases de C++ funcionan bien en bibliotecas compartidas .so (también funcionan en archivos 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 es necesario exportar explícitamente ningún símbolo de las bibliotecas.

Este documento responderá a la mayoría de sus preguntas: http://people.redhat.com/drepper/dsohowto.pdf

Lo principal que debe recordar es utilizar el -fPIC opción al compilar, y el -shared opción al vincular.Puedes encontrar muchos ejemplos en la red.

Otros consejos

Mi solución/prueba

Aquí está mi solución y hace lo que esperaba.

Código

gato.hh :

#include <string>

class Cat
{
    std::string _name;
public:
    Cat(const std::string & name);
    void speak();
};

gato.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;
}

principal.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 compilas 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
$

Según tengo entendido, esto está bien siempre que vincule archivos .so que se compilaron con el mismo compilador.Diferentes compiladores modifican los símbolos de diferentes maneras y no podrán vincularlos.

Esa es una de las ventajas de usar COM en Windows: define un estándar para colocar objetos OOP en archivos DLL.Puedo compilar una DLL usando GNU g++ y vincularla a un EXE compilado con MSVC, ¡o incluso VB!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top