No soy un usuario frecuente de Linux y creo que hice algo mal.
Este es el código para una biblioteca dinámica de prueba ".so" que estoy generando.
class InternalClass { public: int Function(){ return 10; } }; extern "C" { int WrapperFunctionSimple() { return 10; } void WrapperCreateInstance() {InternalClass* item = new InternalClass(); delete item; } }La compilación falla con el siguiente error:
g++ -Wall -fexceptions -O2 -c /home/lidia/compartida/TestLibrary/TestLibrary/main.cpp -o obj/Release/main.o g++ -shared obj/Release/main.o -o bin/Release/libTestLibrary.so -s /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: obj/Release/main.o: warning: relocation against `_Znwm@@GLIBCXX_3.4' in read-only section `.text' /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: obj/Release/main.o: relocation R_X86_64_PC32 against symbol `_Znwm@@GLIBCXX_3.4' can not be used when making a shared object; recompile with -fPIC /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: final link failed: bad value collect2: error: ld returned 1 exit statusProbé con -fPIC como se sugiere y compila. Pero cuando uso esta biblioteca, no se puede cargar cuando agrego esa última función:
void WrapperCreateInstance() {InternalClass* item = new InternalClass(); delete item; }El problema es usar InternalClass, sin esta función todo funciona.
Estoy usando VirtualBox. Instalé OpenSUSE de 64 bits, la aplicación que usa la biblioteca también es de 64 bits. En otra distribución de Linux (Mint), con exactamente el mismo proyecto y configuración (sin fPIC), se puede compilar. Cuando uso esa biblioteca (.so) funciona en SUSE.
También estoy usando:
¿Qué estoy haciendo mal? Esto parece algo que los usuarios avanzados de Linux podrían ayudarme a entender.
EDITAR: Para agregar más información, esto puede compilarse en Ubuntu con la misma configuración. No en SUSE
Esto generalmente significa que no tiene todas las funciones definidas. Un mejor mensaje de error estaría bien, pero esto es lo que tenemos por ahora. Defina todas las funciones utilizadas, y debería estar listo para comenzar.
Me pasó cuando usé GCC para compilar un archivo CPP. Entonces, para los archivos C ++, use solo g ++, y obviamente no GCC, que está destinado a archivos c.
A mí me pasó, si una biblioteca (A) depende de otra (B) y la biblioteca A estaba enlazada antes que la biblioteca B. La solución es enlazar primero la biblioteca B y luego la A.