使用CMake强制进行32位编译的正确方法

对不起,有很多类似的问题,但我发现谷歌searchCMake查询总是产生类似,但不是相同的场景,冲突CMake命令等!

我需要强制我的项目构build32位的二进制文件,因为我必须链接到一个只有32位的库。 我根据如下错误消息来诊断:

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

从我所收集到的,我应该使用:

 set (CMAKE_CXX_FLAGS "-m32") 

这确实改变了事情 – 我现在得到了几个错误,如:

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

而且对于外部库也是一样的错误。 我认为这是因为-m32使gcc生成32位二进制文​​件,但ld仍然在尝试64位输出? 进一步谷歌search这个问题并没有成功,所以如果任何人都可以certificate我是正确的,并给出了正确的方式做到这一点,我将不胜感激!

非常感谢!

如果你想使用cmake编译和链接32位,使用它来创build库和二进制文件:

创build库:

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

创build可执行文件:

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

希望这可以帮助,

即使这看起来像是额外的工作,我相信一个合适的解决scheme是在这种情况下使用工具链文件。 就像是:

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

然后用法很简单:

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

这里的重要部分是,现在可以指定应该用于search第三方库的根目录path( CMAKE_FIND_ROOT_PATH )。 事实上,您的编译器可能不够聪明,无法知道在x86_64系统上如何searchx86 Qt库。

有一个工具链文件允许你在一个par编译器的基础上指定一个不同的文件,你应该能够从windows环境编译32位时调整选项。

现在,这是额外的工作,因为从x86_64 Linux操作系统编译32位数据是非常微不足道的,但是这种解决scheme将适用于其他更奇特的设置。

有关工具链文件的更多信息,可以查看例如:

CMAKE_CXX_FLAGS只影响C ++编译器。 您可能还必须为C编译器设置标志:

 set (CMAKE_C_FLAGS "-m32") 

这听起来好像你没有把m32传给LFLAGS,或者是老的obj文件偷偷摸摸的。 一定要先清理。

这个问题和你的类似: cmake,gcc,cuda和-m32

通过以下来源使用TRY_RUN命令。

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) 

它将在所有标准编译器上工作。

我使用了malat的方法并创build了一个Toolchain文件。

我有一个工具链文件,可以在一些Linux上使用,也许会给你一些启发。 它可能是为你工作,或者你可能需要其他丑陋的黑客来获得其他cmake脚本,你依靠工作或w / e:

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