linux - ejecutar - gcc windows
Enlace estático de la función de biblioteca compartida en gcc (6)
¿Cómo puedo vincular estáticamente una función de biblioteca compartida en gcc?
En gcc, esto no es compatible. De hecho, esto no es compatible con ningún compilador / enlazador existente del que sea consciente.
Referirse a:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Necesita una versión estática de la biblioteca para vincular.
Una biblioteca compartida es en realidad un ejecutable en un formato especial con puntos de entrada especificados (y se incluyen algunos problemas de direccionamiento). No tiene toda la información necesaria para vincular estáticamente.
No puede vincular estáticamente la biblioteca compartida (ni vincular estática dinámicamente)
Flag -static obligará al vinculador a utilizar la biblioteca estática (.a) en lugar de compartida (.so) But. Las bibliotecas estáticas no siempre están instaladas por defecto. Entonces, si necesita un enlace estático, debe instalar bibliotecas estáticas.
Otro posible enfoque es use statifier o Ermine . Ambas herramientas toman como entrada un archivo ejecutable dinámicamente enlazado y como resultado crean un ejecutable autónomo con todas las bibliotecas compartidas incrustadas.
Sí, sé que esta es una pregunta de hace 8 años, pero me dijeron que era posible establecer un vínculo estático con una biblioteca de objetos compartidos y este fue literalmente el éxito cuando busqué más información al respecto.
Para demostrar realmente que no es posible vincular estáticamente una biblioteca de objetos compartidos con ld
(el enlazador de gcc
), a diferencia de un grupo de personas que insisten en que no es posible, use el siguiente comando gcc
:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Por supuesto, tendrá que compilar objectname.o
desde sourcename.c
, y probablemente también deba crear su propia biblioteca de objetos compartidos. Si lo hace, use -Wl,--library-path,.
que ld puede encontrar su biblioteca en el directorio local).
El error real que recibe es:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so''
collect2: error: ld returned 1 exit status
Espero que ayude.
Si desea vincular, digamos, libapplejuice estáticamente, pero no, por ejemplo, liborangejuice , puede vincular de esta manera:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Hay una advertencia: si liborangejuice
usa libapplejuice
, entonces libapplejuice
se vinculará dinámicamente también.
Tendrás que vincular liborangejuice
estáticamente junto con libapplejuice
para obtener libapplejuice
estático.
Y no se olvide de mantener -Wl,-Bdynamic
sino que terminará vinculando todo estático, incluyendo libc
(lo cual no es bueno hacer).
Si tiene el archivo .a de su biblioteca compartida (.so), simplemente puede incluirlo con su ruta completa como si fuera un archivo objeto, como este:
Esto genera main.o simplemente compilando:
gcc -c main.c
Esto vincula ese archivo objeto con la biblioteca estática correspondiente y crea el ejecutable (llamado "main"):
gcc main.o mylibrary.a -o main
O en un solo comando:
gcc main.c mylibrary.a -o main
También podría ser una ruta absoluta o relativa:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Un poco tarde pero ... Encontré un enlace que guardé hace un par de años y pensé que podría ser útil para ustedes:
CDE: crea automáticamente aplicaciones portátiles de Linux
http://www.pgbovine.net/cde.html
- Solo descarga el programa
Ejecute el paso binario como argumento, el nombre del binario que desea hacer portátil, por ejemplo: nmap
./cde_2011-08-15_64bit nmap
El programa leerá todas las bibliotecas vinculadas a nmap y sus dependencias y las guardará todas en una carpeta llamada cde-package / (en el mismo directorio que usted).
- Finalmente, puede comprimir la carpeta e implementar el binario portátil en cualquier sistema.
Recuerde, para iniciar el programa portátil, debe ejecutar el binario ubicado en cde-package / nmap.cde
Atentamente