【问题标题】:Using boost::json static library with cmake将 boost::json 静态库与 cmake 一起使用
【发布时间】:2021-07-12 17:30:17
【问题描述】:

我有这个CMakeLists.txt

set(Boost_USE_STATIC_LIBS   ON)
find_package(Boost REQUIRED COMPONENTS json)
include_directories(${BOOST_INCLUDE_DIRS})
target_link_libraries(<Target> PRIVATE Boost::json)

但我收到 cmake 警告

[cmake] CMake Warning at C:/Program Files/CMake/share/cmake3.20/Modules/FindBoost.cmake:2185 (message):
[cmake]   No header defined for json; skipping header check (note: header-only
[cmake]   libraries have no designated component)

项目可以配置和构建。 ~~但是我找到的compile_command.json实际上并没有链接到静态库,这清楚地表明它没有找到并且被编译为仅头库。~~

编辑:我发现它实际上链接到生成的build.ninja 文件中的libboost_json-mt.a,所以奇怪的是cmake 在find_package 调用中找不到静态库。

build MyTest.exe MyTest[1]_tests.cmake: CXX_EXECUTABLE_LINKER__MyTest_Debug CMakeFiles/MyTest.dir/test.cpp.obj CMakeFiles/MyTest.dir/BasicStructures/Uri.cpp.obj | C$:/msys64/mingw64/lib/libgtest_main.dll.a C$:/msys64/mingw64/lib/libboost_json-mt.a C$:/msys64/mingw64/lib/libgtest.dll.a C$:/msys64/mingw64/lib/libboost_container-mt.a
  FLAGS = -g
  LINK_LIBRARIES = C:/msys64/mingw64/lib/libgtest_main.dll.a  C:/msys64/mingw64/lib/libboost_json-mt.a  C:/msys64/mingw64/lib/libgtest.dll.a  C:/msys64/mingw64/lib/libboost_container-mt.a  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
  OBJECT_DIR = CMakeFiles\MyTest.dir
  POST_BUILD = cmd.exe /C "cd /D C:\Users\Peter\Desktop\LspCpp\build && "C:\Program Files\CMake\bin\cmake.exe" -D TEST_TARGET=MyTest -D TEST_EXECUTABLE=C:/Users/Peter/Desktop/LspCpp/build/MyTest.exe -D TEST_EXECUTOR= -D TEST_WORKING_DIR=C:/Users/Peter/Desktop/LspCpp/build -D TEST_EXTRA_ARGS= -D TEST_PROPERTIES= -D TEST_PREFIX= -D TEST_SUFFIX= -D NO_PRETTY_TYPES=FALSE -D NO_PRETTY_VALUES=FALSE -D TEST_LIST=MyTest_TESTS -D CTEST_FILE=C:/Users/Peter/Desktop/LspCpp/build/MyTest[1]_tests.cmake -D TEST_DISCOVERY_TIMEOUT=5 -D TEST_XML_OUTPUT_DIR= -P "C:/Program Files/CMake/share/cmake-3.20/Modules/GoogleTestAddTests.cmake""
  PRE_LINK = cd .
  RESTAT = 1
  TARGET_FILE = MyTest.exe
  TARGET_IMPLIB = libMyTest.dll.a
  TARGET_PDB = MyTest.exe.dbg

【问题讨论】:

  • Docs 不要提及静态库构建变体。
  • @user7860670 说可以是Link to a built static or dynamic Boost library,我确实找到了libboost_json-mt.a
  • 它表示在使用 boost.json 和其他 boost 库时,您的可执行文件需要链接到构建的静态或动态 Boost 库,而不是 boost.json 本身具有静态风格。
  • 不确定这意味着什么。它似乎也可以使用target_link_libraries(&lt;Target&gt; PRIVATE boost_json-mt),所以它绝对可以静态链接。如果你能用CMakeLists.txt的“预期”用法来回答,那就太好了

标签: c++ boost cmake


【解决方案1】:

6 月 4 日在 https://gitlab.kitware.com/cmake/cmake/-/commits/master/Modules/FindBoost.cmake 上对 findboost 包的最新提交是这样描述自己的:

FindBoost: Add check for json component header in Boost 1.75+

之前的提交增加了对 boost 1_76 的支持。在撰写本文时,最新的是 1_77_0... 所以如果您使用 1_77,您将收到一堆(每个组件一个?)关于不受支持版本的警告消息。我想除非你使用 1_76 或 1_75。

所以你想要的支持现在可用,但在你写这个问题时还没有。我不知道当前可用的 cmake 版本(3.21.2)是否包含该更新。文档当然没有提到它……但不完整的文档在阳光下并不是什么新鲜事。

所以我们需要的支持现在/终于有了,根据 gitlab 站点,该更改包含在 cmake 3.21.2 中。伙计!甜蜜!

所以我们只需要最新的 cmake 就可以了。

【讨论】:

    【解决方案2】:

    我认为您应该包括而不是静态链接选项

     #include <boost/json/src.hpp>
    

    在您的一个翻译单元中。这使得 Boost JSON 有效地只有标头。

    相关文档:https://github.com/boostorg/json#header-only

    接下来,您可以使用此方法创建自己的静态库。请记住,如果您的工具链需要可见性宏 (MSVC),则可以选择定义它们:

    https://github.com/boostorg/json#standalone-shared-library

    【讨论】:

    • 是的,我理解这部分。但是包确实自带libboost_json-mt.a文件,为什么cmake在find_package调用中找不到呢?
    • 看起来 boost::json 从 3.21 开始还没有作为组件添加。仅在 3.9 中提到了 bzip2 和 zlib 组件作为 windows 添加,并且在 3.19 中针对所有平台,但根本没有提到其他组件。我怀疑它只是丢失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2023-03-21
    • 1970-01-01
    • 2011-03-11
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多