Estoy tratando de compilar este código fuente desde el archivo MAKE en un VPS, pero no funciona. El VPS es un sistema operativo de 64 Cent
Aquí está el error completo
# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1
Aquí está mi archivo MAKE:
GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"
COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/
all:
$(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c
$(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp
$(GPP) $(COMPILE_FLAGS) *.cpp
$(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o
Alguien sabe lo que pasa?
recompile with -fPIC
?COMPILE_FLAGS=-c -O3 -w -DLINUX -fPIC -I../SDK/amx/
Respuestas:
Haga lo que le diga el compilador, es decir, vuelva a compilar con
-fPIC
. Para saber qué hace esta bandera y por qué la necesita en este caso, consulte Opciones de generación de código del manual de GCC.En resumen, el término código de posición independiente (PIC) se refiere al código de máquina generado que es independiente de la dirección de memoria, es decir, no hace ninguna suposición sobre dónde se cargó en la RAM. Se supone que solo se incluye código independiente de la posición en los objetos compartidos (SO), ya que deberían tener la capacidad de cambiar dinámicamente su ubicación en la RAM.
Finalmente, también puedes leer sobre esto en Wikipedia .
fuente
-fPIC
a todas las invocaciones del compilador para todos los archivos fuente (unidades de traducción, por ejemplo,*.cpp
archivos) de la biblioteca. La forma concreta de hacerlo depende del sistema de construcción que utilice. Por ejemplo, en CMake podría emitirset_target_properties(${LIBRARY_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
. En el caso de este tipo (usando Make simple y antiguo), tendría que hacerloCOMPILE_FLAGS+=-fPIC
ya que está usando esta variable para indicar el conjunto de indicadores de compilación para todos los archivos fuente de su biblioteca.En mi caso, este error se produjo porque un
make
comando esperaba obtener bibliotecas compartidas (*.so
archivos) de un directorio remoto indicado por unaLDFLAGS
variable de entorno. En un error, solo las bibliotecas estáticas estaban disponibles allí (*.la
o*.a
archivos).Por lo tanto, mi problema no residía en el programa que estaba compilando, sino en las bibliotecas remotas que intentaba recuperar. Por lo tanto, no necesité agregar ningún indicador (digamos
-fPIC
) a la compilación interrumpida por el error de reubicación. Más bien, volví a compilar la biblioteca remota para que los objetos compartidos estuvieran disponibles.Básicamente, ha sido un error de archivo no encontrado disfrazado.
En mi caso, tuve que eliminar un
--disable-shared
conmutador perdido en laconfigure
invocación del programa requerido, ya que las bibliotecas compartidas y estáticas se crearon de forma predeterminada.Me di cuenta de que la mayoría de los programas crean ambos tipos de bibliotecas al mismo tiempo, por lo que el mío es probablemente un caso de esquina. En general, puede darse el caso de que prefiera habilitar las bibliotecas compartidas, según los valores predeterminados.
Para inspeccionar su situación particular con los conmutadores de compilación y los valores predeterminados, leería el resumen que aparece
./configure --help | less
, generalmente en la sección Características opcionales. A menudo descubrí que esta lectura es más confiable que las guías de instalación que no se actualizan mientras los programas de dependencia evolucionan.fuente
No siempre se trata de las banderas de compilación, tengo el mismo error en gentoo cuando uso distcc.
La razón es que en el servidor distcc se usa un perfil no reforzado y en el cliente el perfil está reforzado. Consulte esta discusión: https://forums.gentoo.org/viewtopic-p-7463994.html
fuente
Se corrigió con la
-no-pie
opción en la etapa del enlazador:g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...
fuente
Simplemente limpiar el proyecto lo resolvió por mí.
Mi proyecto es una aplicación C ++ (no una biblioteca compartida). Recibí este error al azar después de muchas compilaciones exitosas.
fuente
Yo tuve el mismo problema. Intente volver a compilar usando
-fPIC
flag.fuente
Recibo la misma solución que el comentario de @ camino en https://stackoverflow.com/a/19365454/10593190 y la respuesta de XavierStuvw .
Lo hice funcionar (para instalar ffmpeg) simplemente reinstalando todo desde el principio con todas las instancias de
$ ./configure
reemplazado por$ ./configure --enable-shared
(primero asegúrese de eliminar todas las carpetas y archivos, incluidos los archivos .so del intento anterior).Aparentemente, esto funciona porque https://stackoverflow.com/a/13812368/10593190 .
fuente