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

5w9g7ksd  于 2022-11-11  发布在  其他
关注(0)|答案(6)|浏览(264)

很抱歉,有很多类似的问题,但我确实发现,在谷歌上搜索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位的输出?进一步的谷歌搜索这个问题没有给予任何成功,所以如果有人能验证我是正确的,并给出正确的方法,我将非常感激!
非常感谢!

3yhwsihp

3yhwsihp1#

如果您想要使用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")
2ic8powd

2ic8powd2#

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


# 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),用于搜索第三方库。实际上,您的编译器可能不够智能,不知道在x86_64系统上哪里搜索x86 Qt库。
拥有一个工具链文件允许一个人在par编译器的基础上指定一个不同的工具链文件,并且当从windows环境中编译32位时,你应该能够调整这个选项。
现在,这是额外的工作,因为从x86_64 Linux操作系统编译32位是相当微不足道的,但这种解决方案将工作在其他更奇特的设置。
有关工具链文件的更多信息,可以查看以下示例:

prdp8dxp

prdp8dxp3#

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

set (CMAKE_C_FLAGS "-m32")
bqucvtff

bqucvtff4#

听起来好像您也没有将m32传递给LFLAGS,或者有旧的obj文件在四处游荡。请确保先进行清理。
这个问题与您的问题类似:cmake, gcc, cuda and -m32

cig3rfwq

cig3rfwq5#

使用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)

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

9udxz4iz

9udxz4iz6#

我使用了malat的方法并制作了一个工具链文件。
我有一个工具链文件,可以在一些Linux dist上工作,也许它会给予你灵感。它可能对你来说是工作的,或者你可能需要其他丑陋的hack来让你依赖的其他cmake脚本工作,或者w/e:
https://github.com/visualboyadvance-m/visualboyadvance-m/blob/master/cmake/Toolchain-cross-m32.cmake

相关问题