在Linux /w GCC或llvm上使用-m32(32位)-构建yaml-cpp库



主题几乎说明了一切:

  • 我下载了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()
  • 和made "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位构建比我现在做的要容易得多。

在一位同事的帮助下,我最终做了以下事情:

  • 顶级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(…"call (near line…/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命令行生成的东西将成功构建(至少在使用gcc/5.2.0的RHEL-7上)

希望能对别人有所帮助。

亨利

最新更新