CMake在64位Linux平台上生成32位程序

首先,如果是C语言,需要确定是否安装了gcc-multilib;如果是C++,需要确定是否安装了g++-multilib。假设Linux平台是Ubuntu发行版,使用C++。

sudo apt install g++-multilib

然后就是对CMake的设置了。

这里分为两个部分,对整个CMake项目设置,对单个Target设置。

对单个Target

target_compile_options(${TARGET_NAME} PUBLIC $<$<PLATFORM_ID:Linux>:-m32>)
target_link_options(${TARGET_NAME} PUBLIC $<$<PLATFORM_ID:Linux>:-m32>)

为啥限定PUBLIC呢?因为Target有可能是动态库或者静态库,使用PUBLIC限定符可以使得这些选项传递到可执行文件上,毕竟32位的库也只能是32位的可执行文件使用。

对整个CMake项目

简单粗暴一点就是:(不知道有没有啥副作用,反正官方是没有给出这种方式,纯属民间科学)

if (Linux)
    # set(CMAKE_CXX_FLAGS -m32)
    add_compile_options(-m32)
    set(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -m32")
    set(CMAKE_SHARED_LINKER_FLAGS  "${CMAKE_SHARED_LINKER_FLAGS} -m32")
    set(CMAKE_MODULE_LINKER_FLAGS  "${CMAKE_MODULE_LINKER_FLAGS} -m32")
endif()

优雅点就是利用一个Interface Libraries

add_library(32bits-build INTERFACE)
target_compile_options(32bits-build INTERFACE $<$<PLATFORM_ID:Linux>:-m32>)
target_link_options(32bits-build INTERFACE $<$<PLATFORM_ID:Linux>:-m32>)

add_library(lib SHARED lib.cpp)
target_link_libraries(lib PUBLIC 32bits-build)

add_executable(main1 main1.cpp)
target_link_libraries(main PRIVATE 32bits-build)

add_executable(main2 main2.cpp)
target_link_libraries(main PRIVATE lib)
# ...

启发

Linux上通过设置参数来达到修改对应配置,那么上述的Interface Libraries + cmake-generator-expression则可以应用在譬如设置其他编译选项(譬如-std=c++17-fPIC等等)、头文件包含目录、库文件包含目录、编译宏定义等等。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值