【发布时间】:2021-05-29 05:17:44
【问题描述】:
主题几乎说明了一切:
- 我下载了 yaml-cpp 版本 0.6.3。
- 我需要在 linux x86_64 上编译,目标是 linux x86_32(在 64 位上构建,在 32 位上使用结果)
- 我一直在尝试添加一个新的“YAML_BUILD_32BIT”选项 - 类似于现有的 YAML_BUILD_SHARED_LIBS 选项。
当我检测到 YAML_BUILD_32BIT 已设置时:我尝试将“-m32”添加到一堆 cmake 变量中。 我的问题是这个变量列表似乎无穷无尽或定义不明确。
- “yaml_cxx_flags”被传递给 yaml-cpp 库代码的编译和链接步骤......但不是构建谷歌“模拟”代码。同样,我发现我也可以设置其他变量,因此 google-mock 也可以使用 -m32 编译...但是 yaml-cpp 模拟测试看不到标志...等等。
我认为我遗漏了一些非常基本的东西。我希望我需要更新一个变量...可能是 2 或 3。我不希望继续找到越来越多的变量。
--
添加更多细节:
到 CMakeLists.txt:
- 添加的行(紧跟在创建 YAML_BUILD_SHARED_LIBS 标志的类似行之后)
option(YAML_BUILD_32BIT "Build with '-m32'" OFF)
- 稍晚一点(紧接在 YAML_BUILD_SHARED_LIBS if/else 之后):
if(YAML_BUILD_32BIT)
# seem to need this one for the shared lib link of yaml-cpp lib
# CXX_FLAGS passed to both compile and link
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
# seem to need this one, to get flag passed to gmock build
set(FLAG_TESTED "${FLAG_TESTED} -m32")
# this one passed to compile and link of testcase
set(yaml_cxx_flags "${yaml_cxx_flags} -m32")
endif()
- 并在紧接着的下一行添加了“FLAG_TESTED”:
set(FLAG_TESTED "-Wextra -Wshadow -Weffc++ -pedantic -pedantic-errors ${FLAG_TESTED}")
鉴于以上情况,然后配置:
# using cmake/3.19.3
cmake -G "Unix Makefiles" -DYAML_BUILD_SHARED_LIBS=ON -DYAML_BUILD_32BIT=ON"
...然后使用“make VERBOSE=1”构建,我看到“gmock-all.cc.o”没有收到 -m32 标志。 (gmock-all.cc.o 只是我日志中的第一个这样的文件。还有其他文件。) 如果我删除 CMakeLists.txt 中试图添加标志的其他行 - 那么其他编译命令或其他链接命令看不到 -m32 并且将失败。
正如我所说:我认为我误解了一些基本的东西。我怀疑配置 32 位版本比我做的要容易得多。
【问题讨论】:
-
您是否检查过that question 关于在 64 位环境中编译 32 位二进制文件的信息?它的答案都没有建议设置“一堆 cmake 变量”。
-
我们有很多在 32 位模式(以及 64 位模式)下构建和测试的代码......所以是(或否?)我的具体问题是如何设置升级 yaml-cpp 配置,以便 所有 对象(代码、测试基础设施和测试用例)使用 -m32 编译,所有共享库和可执行文件都使用 -m32 链接。
-
引用问题的second answer 是一个 toolchain 文件,它是在任何 CMake 项目之外创建的。你试过这种方法吗?请显示(添加到问题帖子中)您究竟尝试了什么。
-
刚刚测试过:在
project(YAML_CPP VERSION 0.6.3 LANGUAGES CXX)行之后立即添加set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")行会将-m32添加到每个编译中,即使对于gmock-all.cc.o也是如此。顺便说一句,即使不修改项目,将-DCMAKE_CXX_FLAGS=-m32传递给cmake也可以工作。 -
感谢您的帮助..以及您的耐心。您的 CMakeLists.txt 文件似乎与我的不同 - 并且具有不同的行为。我下载了在 yaml-cpp-0.6.3 发布标签页面上找到的 tarball。该版本的“项目”条目看起来像:“项目(YAML_CPP VERSION 0.6.3)” - 这似乎与您看到的行不同。我恢复了所有更改,然后尝试使用 'cmake -G "Unix Makefiles" -DYAML_BUILD_SHARED_LIBS=ON -DCMAKE_CXX_FLAGS=-m32" 进行配置 - 但看到同样的问题:至少文件 gtest-all.cpp.o 和 gmock-all .cc.o 没有看到 -m32 标志 - 所以构建失败