【问题标题】:build yaml-cpp lib with -m32 (32-bit) - on linux /w gcc or llvm使用 -m32(32 位)构建 yaml-cpp 库 - 在 linux /w gcc 或 llvm 上
【发布时间】: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 标志 - 所以构建失败

标签: cmake yaml-cpp


【解决方案1】:

在同事的帮助下,我完成了以下工作:

  • 顶级 CMakeLists.txt 文件(靠近第 28 行,紧跟 YAML_BUILD_SHARED_LIBS 变量的定义):
  option(YAML_BUILD_32BIT "Build with '-m32'" OFF)

  if(YAML_BUILD_32BIT)
     add_compile_options(-m32)
     add_link_options(-m32)
  endif()
  • 在 .../test/CMakeLists.txt(第 10 行附近):
  if(YAML_BUILD_32BIT)
    set(GTEST_EXTRA_FLAGS "-DCMAKE_CXX_FLAGS=-m32")
  endif()
  • 然后将新标志添加到“ExternalProject_Add(...”调用 (近线 .../test/CMakeLists.txt:22):
ExternalProject_Add(
        googletest_project
        SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.8.0"
        INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/prefix"
        CMAKE_ARGS
                -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
                -DBUILD_GMOCK=ON
                -Dgtest_force_shared_crt=ON
                ${GTEST_EXTRA_FLAGS}  # <- this line added
)

以上具有将额外的“-m32”标志传递给嵌入式gmocktest项目的效果。

鉴于上述更改,上面的 cmake 命令行会生成可以成功构建的内容(至少在 RHEL-7 上,使用 gcc/5.2.0)

希望这可以帮助其他人。

亨利

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 2023-03-21
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2017-08-30
    • 2022-08-14
    相关资源
    最近更新 更多