2011-04-27 29 views
36

Lamento que haya muchas preguntas similares, pero sí descubro que Google para consultas de CMake siempre produce escenarios similares pero no idénticos, comandos de CMake en conflicto y, por lo tanto, ¡en!La forma correcta de forzar una compilación de 32 bits utilizando CMake

Necesito forzar mi proyecto para compilar binarios de 32 bits porque tengo que enlazar con una biblioteca que solo está disponible como de 32 bits. Me diagnosticaron esta basado en mensajes de error como:

/usr/bin/ld: i386 architecture of input file `*external-32bit-lib*' is incompatible with i386:x86-64 output 

Por lo que sé, yo debería, por tanto, utilizar:

set (CMAKE_CXX_FLAGS "-m32") 

Esto cambia las cosas - ahora consigo varios errores como:

/usr/bin/ld: i386 architecture of input file `*project-output-lib*' is incompatible with i386:x86-64 output 

Y aún así obtener los mismos errores para la biblioteca externa también. I piensa esto se debe a que el -m32 hizo que gcc generara binarios de 32 bits, pero ld todavía está tratando de obtener una salida de 64 bits? Seguir buscando en Google para este problema no dio ningún éxito, así que si alguien pudiera verificar que tengo razón y dar la forma correcta de hacerlo, ¡le estaría muy agradecido!

¡Muchas gracias!

Respuesta

4

Parece que tampoco pasó m32 a LFLAGS, o hay viejos archivos obj escondidos. Asegúrate de limpiar primero.

Esta pregunta es similar a la suya: cmake, gcc, cuda and -m32

+0

Gracias -que bien puede ser el caso - pero ¿cómo Lo hago a través de CMake? ¿Y esta es la forma más sensata o "adecuada" de hacerlo? Lo hice por cierto :) – jazzbassrob

+0

Respuesta actualizada. Ver enlace. Me refiero a limpiar tus manos, estás sucio :) –

+0

Saludos, pero desafortunadamente el enlace no parece ayudar. Establecer LDFLAGS parece no tener ningún efecto ... – jazzbassrob

5

CMAKE_CXX_FLAGS sólo afecta al compilador de C++. Es probable que también tiene que establecer el indicador para el compilador C:

set (CMAKE_C_FLAGS "-m32") 
3

Uso de comandos TRY_RUN por la siguiente fuente.

size.cpp:

#include <cstdlib> 

int main(int argc, char** argv) 
{ 
    size_t size = sizeof(void*); 
    if (size == 4) 
    return 0; 
    return 1; 
} 

CMakeLists.txt:

TRY_RUN(RUN_RESULT_VAR COMPILE_RESULT_VAR ${your_temp_dir} size.cpp RUN_OUTPUT_VARIABLE IS_64_SYSTEM) 
IF(IS_64_SYSTEM) 
    MESSAGE(FATAL_ERROR "64 compiling not allowed!") 
ENDIF(IS_64_SYSTEM) 

Se trabajará sobre todo compilador estándar.

33

Si desea compilar y enlazar de 32 bits utilizando el uso cmake esto para la creación de bibliotecas y binarios:

bibliotecas Creación:

add_library(mylib SHARED my_source.c) 
set_target_properties(mylib PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") 

creación de ejecutables:

add_executable(mybin sources.c) 
set_target_properties(mybin PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") 

Esperamos que esta ayuda,

13

Incluso si esto parece que funciona extra, creo que una solución adecuada on es usar el archivo toolchain en este caso.Algo así como:

# the name of the target operating system 
set(CMAKE_SYSTEM_NAME Linux) 

# which compilers to use for C and C++ 
set(CMAKE_C_COMPILER gcc) 
set(CMAKE_C_FLAGS -m32) 
set(CMAKE_CXX_COMPILER g++) 
set(CMAKE_CXX_FLAGS -m32) 

# here is the target environment located 
set(CMAKE_FIND_ROOT_PATH /usr/i486-linux-gnu) 

# adjust the default behaviour of the FIND_XXX() commands: 
# search headers and libraries in the target environment, search 
# programs in the host environment 
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

Luego de uso es simple:

$ cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake /path/to/source 

La parte importante aquí es que uno es ahora capaz de especificar una ruta de directorio raíz (CMAKE_FIND_ROOT_PATH) que se debe utilizar para buscar terceros lib. De hecho, su compilador puede no ser lo suficientemente inteligente como para saber dónde buscar una biblioteca x86 Qt en un sistema x86_64.

Tener un archivo de cadena de herramientas permite especificar uno diferente en base a un compilador par, y debería ser capaz de modificar la opción al compilar en 32bits desde un entorno de Windows.

Hoy en día esto es algo extra, ya que la compilación de 32 bits de un sistema operativo Linux x86_64 es bastante trivial, pero esta solución funcionará para otras configuraciones más exóticas.

Para obtener más información sobre la cadena de herramientas de archivos, se puede comprobar, por ejemplo:

+3

Un archivo de cadena de herramientas puede ser demasiado cuando 'cmake/path/to/source -DCMAKE_CXX_FLAGS = -m32 -DCMAKE_C_FLAGS = -m32' podría hacerlo, pero estas dos son las únicas formas adecuadas de manejar esta situación. CMakeLists.txt no debe contener este tipo de "información". A menos que el OP quiera evitar que una compilación de 64 bits suceda. – rubenvb

+0

@rubenvb como se explica en mi publicación, todavía necesita 'CMAKE_FIND_ROOT_PATH' para ayudar a cmake manejar algo como' find_package (Qt) ' – malat

+0

usando esta técnica y cmake 3.9.3, CMAKE_CXX_FLAGS definido en toolchain NO se propagó en proyectos secundarios la primera vez Estoy creando el directorio de construcción. Pero el comportamiento cambia si ejecuta por segunda vez el comando para crear el directorio de compilación sin eliminar el directorio de compilación existente. No sé exactamente si esta es una característica normal o no ... Para resolver el problema, definí CMAKE_CXX_FLAGS como sigue en el archivo toolchain: 'set (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -m32 "CACHE STRING" C++ flags ") ' – sancelot

Cuestiones relacionadas