使用 CMake 构建 fmt 时出现问题

Posted

技术标签:

【中文标题】使用 CMake 构建 fmt 时出现问题【英文标题】:Issue on build fmt with CMake使用 CMake 构建 fmt 时出现问题 【发布时间】:2019-08-23 09:17:45 【问题描述】:

我在使用 CMake 构建 fmt 时遇到问题。

一个项目的结构如下:

.
├── CMakeLists.txt
├── dep
│   └── fmt
└── src
    ├── CMakeLists.txt
    └── main.cpp

./CMakeLists.txt 如下:

cmake_minimum_required(VERSION 3.2)
project(fmtdemo)
add_subdirectory(dep/fmt)
add_subdirectory(src)

./src/CMakeLists.txt 如下:

project(fmtdemo)
add_library(fmtdemo main.cpp)
add_library(fmtdemo::fmtdemo ALIAS fmtdemo)
target_link_libraries(fmtdemo PUBLIC fmt::fmt-header-only)
add_executable(fdemo main.cpp)

./src/main.cpp 如下:

#include "../dep/fmt/include/fmt/core.h"
using namespace std;
int main()

    fmt::print("Elapsed time: 0:.2f seconds", 1.23);
    string message = fmt::format("The answer is ", 42);
    return 0;

当我构建它时,我收到一个错误:

CMakeFiles/fdemo.dir/main.cpp.o: In function `void fmt::v5::print<char [30], double, 0>(char const (&) [30], double&&)':
main.cpp:(.text._ZN3fmt2v55printIA30_cJdELi0EEEvRKT_DpOT0_[_ZN3fmt2v55printIA30_cJdELi0EEEvRKT_DpOT0_]+0x78): undefined reference to `fmt::v5::vprint(fmt::v5::basic_string_view<char>, fmt::v5::format_args)'
CMakeFiles/fdemo.dir/main.cpp.o: In function `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > fmt::v5::format<char [17], int, char>(char const (&) [17], int&&)':
main.cpp:(.text._ZN3fmt2v56formatIA17_cJiEcEENSt7__cxx1112basic_stringIT1_St11char_traitsIS5_ESaIS5_EEERKT_DpOT0_[_ZN3fmt2v56formatIA17_cJiEcEENSt7__cxx1112basic_stringIT1_St11char_traitsIS5_ESaIS5_EEERKT_DpOT0_]+0x7f): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
fmt::v5::internal::vformat<char>(fmt::v5::basic_string_view<char>, fmt::v5::basic_format_args<fmt::v5::basic_format_context<std::back_insert_iterator<fmt::v5::internal::buffer<char> >, char> >)'
collect2: error: ld returned 1 exit status
src/CMakeFiles/fdemo.dir/build.make:83: recipe for target 'src/fdemo' failed
make[2]: *** [src/fdemo] Error 1
CMakeFiles/Makefile2:170: recipe for target 'src/CMakeFiles/fdemo.dir/all' failed
make[1]: *** [src/CMakeFiles/fdemo.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

【问题讨论】:

fdemo 可执行文件未与fmt 链接。我想你想链接fdemo 而不是fmtdemo,与fmt @KamilCuk 你能告诉我如何将fdemo 可执行文件与fmt 链接起来吗?我不熟悉 CMake ????谢谢!你可以编辑github.com/ChungZH/FmtPost上的文件 你做了target_link_libraries(fmtdemo PUBLIC fmt::fmt-header-only)。我猜你想要的是target_link_libraries(fdemo PUBLIC fmt::fmt-header-only) CMake Error at src/CMakeLists.txt:6 (target_link_libraries): Cannot specify link libraries for target "fdemo" which is not built by this project.@KamilCuk 修改后,错误变成了这样。 add_executable(fdemo main.cpp) - fdemo 显然是由您的 cmake 构建的。您应该在之后添加它 add_executable,而不是之前。 【参考方案1】:

你应该链接fmt,而不是fmt-header-only

target_link_libraries(fmtdemo PUBLIC fmt::fmt)

或者,如果您想使用仅标头配置,请确保包含 fmt/format.h 标头而不是 fmt/core.h。后者提供了 API 的子集以加快编译速度,并且需要与 fmt 库链接。

【讨论】:

错误:CMakeFiles/fdemo.dir/main.cpp.o: In function void 'fmt::v5::print&lt;char [30], double, 0&gt;(char const (&amp;) [30], double&amp;&amp;)':

以上是关于使用 CMake 构建 fmt 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cmake 文件在 Visual Studio 中构建 Qt 项目时出现链接错误

链接到从源代码构建的 OpenCV 时出现 Cmake 问题

构建包时出现 Cmake 错误

cmake mingw-w64:尝试构建时出现奇怪的错误

运行颤振桌面应用程序时出现CMake错误

尝试使用任何 CUDA 功能时出现分段错误