[CMake] Configure 32 bit build in 64 bit environment from cli

Nicola Mori nicolamori at aol.com
Fri Mar 29 04:18:46 EDT 2013


Thanks for your reply, Martin. Actually, I found that all my problems 
stem from the fact that my project correctly sets CMAKE_CXX_FLAGS when 
specifying -DCMAKE_CXX_FLAGS on CMake invocation, but then this setting 
is overridden by the settings of another project on which my projects 
depends (via find_package). Setting -m32 consistently across my whole 
software stack resolves the problem.
Sorry for bothering the list with a non-problem :)
Cheers,

Nicola

On 28/03/2013 19:19, Martin Koller wrote:
> On Wednesday 27 March 2013 10:37:12 Nicola Mori wrote:
>> Hello, for my project I'd like to be able to configure a 32 bit build
>> with GCC in a 64 bit Linux environment by setting variables from command
>> line interface. As far as I understand of CMake, this can be
>> accomplished by setting CMAKE_CXX_FLAGS and CMAKE_SHARED_LINKER_FLAGS to
>> "-m32" (my project consists only of a library). So I configure with:
>>
>> cmake -DCMAKE_CXX_FLAGS=-m32 -DCMAKE_SHARED_LINKER_FLAGS=-m32 /path/to/code
>>
>> and indeed the cached variables reflect my settings:
>>
>> $ cmake -i /path/to/code
>>
>> Variable Name: CMAKE_CXX_FLAGS
>> Description: Flags used by the compiler during all build types.
>> Current Value: -m32
>>
>> Variable Name: CMAKE_SHARED_LINKER_FLAGS
>> Description: Flags used by the linker during the creation of dll's.
>> Current Value: -m32
>>
>>
>> So everything seems fine, and then I launch make. I immediately get this
>> error message:
>>
>> /usr/bin/ld: i386:x86-64 architecture of input file
>> `CMakeFiles/GGSNameDecoder.dir/GGSNameDecoder.cpp.o' is incompatible
>> with i386 output
>>
>> So it seems that the linker is trying to create a 32 bit library using a
>> 64 bit object file. Indeed, the object file is 64 bit:
>>
>> $ file src/CMakeFiles/GGSNameDecoder.dir/GGSNameDecoder.cpp.o
>> src/CMakeFiles/GGSNameDecoder.dir/GGSNameDecoder.cpp.o: ELF 64-bit LSB
>> relocatable, x86-64, version 1 (SYSV), not stripped
>>
>> So I would say that the setting of CMAKE_CXX_FLAGS is ignored while
>> CMAKE_SHARED_LINKER_FLAGS is correctly accounted for. I tried to set
>> also CMAKE_C_FLAGS to -m32 without success, anyway my code is C++.
>> Interestingly, if I hard-code the -m32 into my CMakeLists.txt like this:
>>
>> set(CMAKE_CXX_FLAGS "-m32")
>>
>> then the 32 bit build works smoothly.
>> I get this behavior both with CMake 2.8.7 and 2.8.10. I don't know if I
>> am missing something, if it is a bug in CMake or in my project, or if it
>> is the intended behavior. I only know that I would need some help to get
>> through it, thanks!
>
> I'm doing this with a toolchain file, so that cmake sees this as cross-compiling.
>
> E.g. I have the following toolchain file "linux_i686.toolchain.cmake":
>
> # toolchain file for building a 32bit version on a 64bit host
>
> # use it like this:
> # cmake -DCMAKE_TOOLCHAIN_FILE=linux_i686.toolchain.cmake <sourcedir>
>
> set(CMAKE_SYSTEM_NAME Linux)
> set(CMAKE_SYSTEM_VERSION 1)
> set(CMAKE_SYSTEM_PROCESSOR "i686")
>
> set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32" CACHE STRING "c++ flags")
> set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -m32" CACHE STRING "c flags")
>


More information about the CMake mailing list