首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制使用CMake进行32位编译的正确方法

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

Stack Overflow用户
提问于 2011-04-27 14:38:17
回答 6查看 93.4K关注 0票数 62

对不起,有许多类似的问题,但我确实发现,谷歌的CMake查询总是产生相似的-但不一样的场景,冲突的CMake命令等等!

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

代码语言:javascript
复制
/usr/bin/ld: i386 architecture of input file `*external-32bit-lib*' is incompatible with i386:x86-64 output

因此,根据我收集的资料,我应该使用:

代码语言:javascript
复制
set (CMAKE_CXX_FLAGS "-m32")

这确实改变了一些事情--我现在收到了以下几个错误:

代码语言:javascript
复制
/usr/bin/ld: i386 architecture of input file `*project-output-lib*' is incompatible with i386:x86-64 output

对于外部库,仍然会得到相同的错误。我认为这是因为-m32让gcc生成了32位二进制文件,但是ld仍然在尝试64位的输出吗?进一步搜索这个问题并没有取得任何成功,所以如果有人能证实我是对的,并给出正确的方法,我将非常感激!

非常感谢!

EN

回答 6

Stack Overflow用户

发布于 2013-10-11 04:49:50

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

创建图书馆:

代码语言:javascript
复制
add_library(mylib SHARED my_source.c)
set_target_properties(mylib PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

创建可执行文件:

代码语言:javascript
复制
add_executable(mybin sources.c)
set_target_properties(mybin PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
票数 50
EN

Stack Overflow用户

发布于 2015-01-20 13:54:40

即使这看起来是额外的工作,我相信正确的解决方案是在这种情况下使用工具链文件。类似于:

代码语言:javascript
复制
# 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)

那么简单的用法是:

代码语言:javascript
复制
$ cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake /path/to/source

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

有了工具链文件,就可以在par编译器的基础上指定另一个工具链文件,并且在从windows环境编译32位时,您应该能够调整选项。

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

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

票数 24
EN

Stack Overflow用户

发布于 2011-04-27 16:16:37

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

代码语言:javascript
复制
set (CMAKE_C_FLAGS "-m32")
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5805874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档