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

时间:2011-04-27 14:38:18

标签: c++ gcc cmake 32bit-64bit ld

很抱歉有很多类似的问题,但我确实发现谷歌搜索CMake查询总是产生类似但不相同的场景,冲突的CMake命令等等!

我需要强制我的项目构建32位二进制文​​件,因为我必须链接一个只能作为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位输出?进一步搜索这个问题没有取得任何成功,所以如果有人能够证实我是对的并且给出正确的方法,我将非常感激!

非常感谢!

6 个答案:

答案 0 :(得分:38)

如果要使用cmake编译和链接32位,请使用它来创建库和二进制文件:

创建库:

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

创建可执行文件:

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

希望这有帮助,

答案 1 :(得分:15)

即使这似乎是额外的工作,我相信一个正确的解决方案是在这种情况下使用工具链文件。类似的东西:

# 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

这里的重要部分是,现在可以指定一个根目录路径(CMAKE_FIND_ROOT_PATH),该路径应该用于搜索第三方lib。实际上,您的编译器可能不够聪明,无法知道在x86_64系统上搜索x86 Qt库的位置。

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

现在这是额外的工作,因为从x86_64 Linux操作系统编译32位非常简单,但这个解决方案适用于其他更奇特的设置。

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

答案 2 :(得分:7)

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

set (CMAKE_C_FLAGS "-m32")

答案 3 :(得分:4)

听起来你没有将m32传递给LFLAGS,或者有一些旧的obj文件躲藏起来。一定要先清理干净。

此问题与您的问题类似:cmake, gcc, cuda and -m32

答案 4 :(得分:3)

使用以下来源的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)

它适用于所有标准编译器。

答案 5 :(得分:1)

我使用了malat的方法并制作了一个工具链文件。

我有一个适用于某些Linux dists的工具链文件,也许它会给你灵感。它可能对你有用,或者你可能需要其他丑陋的黑客来获得你依赖的其他cmake脚本来工作或w / e:

documentation