4 votos

La compilación de un 32 aplicación de 64 bits, sin deshacerse de GNU para ARM EABI

Quiero construir un programa de C++ de 32 bits en mi 64 bits 16.04.

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.a when searching for -lstdc++
/usr/bin/ld: cannot find -lstdc++
collect2: error: ld returned 1 exit status

Vincular el uso de g++ error de búsqueda para la -lstdc++ dice que debo instalar libc6-i386 libc6-dev-i386 lib32gcc1 lib32stdc++6, lo que da:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
lib32gcc1 is already the newest version (1:6.0.1-0ubuntu1).
lib32gcc1 set to manually installed.
libc6-dev-i386 is already the newest version (2.23-0ubuntu3).
libc6-dev-i386 set to manually installed.
libc6-i386 is already the newest version (2.23-0ubuntu3).
lib32stdc++6 is already the newest version (5.3.1-14ubuntu2.1).
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

OK, bueno, ahora vamos a tratar el aceptado respuesta: instale g++-multilib (o gcc-multilib, el resultado es el mismo):

Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  binutils-arm-linux-gnueabi cpp-5-arm-linux-gnueabi cpp-arm-linux-gnueabi gcc-5-arm-linux-gnueabi-base
  gcc-5-cross-base libasan2-armel-cross libasan2-dbg-armel-cross libatomic1-armel-cross libatomic1-dbg-armel-cross
  libc6-armel-cross libc6-armhf-armel-cross libc6-armhf-cross libc6-dev-armel-cross libc6-dev-armhf-armel-cross
  libc6-dev-armhf-cross libgcc-5-dev-armel-cross libgcc1-armel-cross libgcc1-dbg-armel-cross libgomp1-armel-cross
  libgomp1-dbg-armel-cross libhfasan2-armel-cross libhfatomic1-armel-cross libhfgcc-5-dev-armel-cross
  libhfgcc1-armel-cross libhfgomp1-armel-cross libhfstdc++6-armel-cross libhfubsan0-armel-cross libstdc++6-armel-cross
  libubsan0-armel-cross libubsan0-dbg-armel-cross linux-libc-dev-armel-cross linux-libc-dev-armhf-cross
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  g++-5-multilib gcc-multilib lib32gcc1-dbg lib32stdc++-5-dev lib32stdc++6-5-dbg libx32gcc1-dbg libx32stdc++-5-dev
  libx32stdc++6-5-dbg
The following packages will be REMOVED:
  gcc-5-arm-linux-gnueabi gcc-5-multilib-arm-linux-gnueabi gcc-arm-linux-gnueabi
The following NEW packages will be installed:
  g++-5-multilib g++-multilib gcc-multilib lib32gcc1-dbg lib32stdc++-5-dev lib32stdc++6-5-dbg libx32gcc1-dbg
  libx32stdc++-5-dev libx32stdc++6-5-dbg
0 upgraded, 9 newly installed, 3 to remove and 1 not upgraded.
Need to get 14.7 MB of archives.
After this operation, 82.5 MB of additional disk space will be used.

Me gusta ser capaz de construir GNU C11 en mi portátil y hacer que se ejecute en mi teléfono (ver aquí), lo cual es posible con arm-linux-gnueabi-gcc, por lo que no quiere deshacerse de eso. (Estoy interesado en hacer lo mismo para C++11).

Los nuevos paquetes que gcc-multilib instalará parecen ser exclusivos de C++, pero va a quitar compiladores de C y binutils para el BRAZO y otras plataformas, que quiero mantener.

Puedo tener compiladores para 32 bits GNU C++11 y el BRAZO de GNU C11 simultáneamente?

1voto

Kizz Puntos 128

El paquete de instalación de otros arquitectura compiladores pone en un área del sistema. Los ejecutables son únicamente de nombre, pero el paquete es demasiado "útil" y piensa que usted realmente necesita un nombre corto de vínculo (como gcc) para apuntar a ellos, y vaya, otro paquete ya utiliza ese enlace, tienes que eliminar para usted. Esto podría estar bien en una máquina virtual, dedicada a una especie de cadena de herramientas, pero no es deseable en circunstancias normales.

Puede desempaquetar el paquete de sí mismo, y copiar los archivos ejecutables en /usr/bin, si quieres. Si varios usuarios están utilizando el compilador, que sería la forma de hacerlo, pero como un usuario único, que yo nunca me molestó. Desempaquetas localmente en mi propio directorio, y establecer enviromment variables y vínculos locales según sea necesario. El inconveniente no está recibiendo las actualizaciones de los paquetes a medida que salen. El beneficio consiste en seleccionar si desea cambiar el compilador de la versión de prueba de la nueva instalación contra el viejo, y cuando se haya validado el nuevo paquete que satisfaga sus necesidades, usted puede cambiar. Usted no puede hacer eso por poner la nueva versión de la norma en el área del sistema debido a que la nueva versión nombres no son diferentes de los antiguos.

ejemplo de un local de la cadena de herramientas secuencia de comandos de instalación:

$ cat crossexp
MY_ARM_BASE=${HOME}/dev/toolchain/arm-2008q3
C_INCLUDE_PATH=${MY_ARM_BASE}/lib/gcc/arm-none-linux-gnueabi/4.3.2/include:${MY_ARM_BASE}/lib/gcc/arm-none-linux-gnueabi/4.3.2/include-fixed
LIBRARY_PATH=${MY_ARM_BASE}/arm-none-linux-gnueabi/libc/lib:${MY_ARM_BASE}/arm-none-linux-gnueabi/libc/usr/lib
CPLUS_INCLUDE_PATH=${MY_ARM_BASE}/arm-none-linux-gnueabi/include/c++/4.3.2
#OBJC_INCLUDE_PATH
COMPILER_PATH=${MY_ARM_BASE}/bin
#LD_RUN_PATH
#GPROF_PATH
#######
CC=${COMPILER_PATH}/gcc
CXX=${COMPILER_PATH}/g++
RANLIB=${COMPILER_PATH}/ranlib
STRIP=${COMPILER_PATH}/strip
export C_INCLUDE_PATH LIBRARY_PATH CPLUS_INCLUDE_PATH OMPILER_PATH
export CC CXX RANLIB STRIP

Los ejecutables están en ${COMPILER_PATH} con nombres como
arm-none-linux-gnueabi-gcc así que usted puede añadir un enlace a ese directorio con el nombre corto:

ln -s arm-none-linux-gnueabi-gcc gcc

Solo una conveniencia para usted, la mayoría de los makefiles que se ejecute fuera de las definiciones, como la que se muestra arriba, y el nombre completo podría haber sido fácilmente utiliza allí, en lugar de un nombre corto.

Tiene un script de instalación para cada arquitectura, y usted puede tener una configuración de secuencias de comandos para diferentes versiones de un compilador dentro de una arquitectura.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: