ahora, por lo que puedo ver, el comando es -l + filename
, por ejemplo, mi nombre de archivo es directory/libtest.so
seria -ldirectory/libtest.so
No, eso no es correcto. Debería ser -Ldirectory -ltest
es decir, usas -L
para agregar un directorio a las rutas de búsqueda donde el enlazador buscará bibliotecas, y usted dice a qué bibliotecas enlazar con -l
, sino para vincular a libtest.so
o libtest.a
dices -ltest
sin el lib
prefijo o la extensión del archivo.
Tu puedes enlace nombrando el archivo explícitamente, sin -L
o -l
opciones, es decir, solo directory/libtest.so
, pero para las bibliotecas dinámicas, eso casi siempre es incorrecto, ya que incrusta esa ruta exacta en el ejecutable, por lo que la misma biblioteca debe estar en el mismo lugar cuando se ejecuta el programa. Por lo general, desea vincularlo por nombre (no por ruta) para que la biblioteca con ese nombre se pueda usar desde cualquier ubicación en tiempo de ejecución.
Este es un procedimiento paso a paso de cómo crear y vincular un archivo .so con un archivo .cpp
-
Cree el archivo .cpp que desea convertir a .so.
Ejemplo -
#include<stdio.h> int add(int a , int b) { return a+b;}
Guárdelo por nombre add.cpp
-
Crea .so con el siguiente comando
gcc -c -fPIC add.cpp -o add.o
Esto crea libadd.so
-
Cree un archivo .cpp que usará este archivo .so
Ejemplo-
#include<stdio.h> extern int add(int a, int b); int main(int argc, char** argv) { printf("Hello the output is %d \n",add(10,15)); return 0; }
Guárdelo como main_file.cpp
-
Cree un archivo .o a partir de este archivo usando este comando
g++ -c main_file.cpp
-
Enlace .so con .o usando este comando
g++ -o prog main_file.o -L. -ladd
Aquí L especifica la carpeta con el archivo .so
Y -l especifica el nombre de la biblioteca .so -
Ejecuta el programa con el comando
./prog