The proper way of forcing a 32-bit compile using CMake

前端 未结 6 725
被撕碎了的回忆
被撕碎了的回忆 2020-12-07 15:40

Sorry that there are many similar questions, but I do find that Googling for CMake queries always yields similar-but-not-the-same scenarios, conflicting CMake commands and s

相关标签:
6条回答
  • 2020-12-07 16:04

    I used malat's approach and made a Toolchain file.

    I have a Toolchain file that works on some Linux dists, perhaps it will give you inspiration. It may work for you as is, or you may need other ugly hacks to get other cmake scripts you rely on to work or w/e:

    https://github.com/visualboyadvance-m/visualboyadvance-m/blob/master/cmake/Toolchain-cross-m32.cmake

    0 讨论(0)
  • 2020-12-07 16:05

    It sounds like you did not pass m32 to LFLAGS too, or there are old obj files skulking about. Be sure to clean first.

    This question is similar to yours: cmake, gcc, cuda and -m32

    0 讨论(0)
  • 2020-12-07 16:13

    CMAKE_CXX_FLAGS only affects the C++ compiler. You probably also have to set the flag for the C compiler:

    set (CMAKE_C_FLAGS "-m32")
    
    0 讨论(0)
  • 2020-12-07 16:15

    If you want to compile and link for 32 bit using cmake use this for creating libraries and binaries:

    Creating libraries:

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

    creating executables:

    add_executable(mybin sources.c)
    set_target_properties(mybin PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
    
    0 讨论(0)
  • 2020-12-07 16:17

    Use TRY_RUN command by the following source.

    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)
    

    It will work on all standard compiler.

    0 讨论(0)
  • 2020-12-07 16:24

    Even if this seems like extra works, I believe a proper solution is to use toolchain file in this case. Something like:

    # 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)
    

    Then usage is simply:

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

    The important part here is that one is now able to specify a root dir path (CMAKE_FIND_ROOT_PATH) which should be used to search for third party lib. Indeed your compiler may not be smart enough to know where to search for an x86 Qt library on an x86_64 system.

    Having a toolchain file allows one to specify a different one on a par compiler basis, and you should be able to tweak the option when compiling in 32bits from a windows environement.

    Nowadays this is extra works since compiling 32bits from an x86_64 Linux OS is pretty much trivial, but this solution will work for other more exotic setup.

    For more information on toolchain file, one can check for example:

    • http://www.cmake.org/Wiki/CmakeMingw
    0 讨论(0)
提交回复
热议问题