Как использовать только библиотеку заголовков fmt без получения "Неопределенные символы для архитектуры x86_64"
Я пытаюсь использовать библиотеку заголовков форматирования fmt ( https://github.com/fmtlib/fmt) в моем проекте C++.
Я добавил путь к основному заголовочному файлу в верхней части моего основного файла следующим образом:
#include "../third_party/fmt/core.h"
но когда я пытаюсь вызвать любую функцию, как:
string message = fmt::format("The answer is {}", 42);
Я получаю следующую ошибку:
Undefined symbols for architecture x86_64:
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > fmt::v5::internal::vformat<char>(fmt::v5::basic_string_view<char>, fmt::v5::basic_format_args<fmt::v5::buffer_context<char>::type>)", referenced from:
std::__1::basic_string<std::__1::enable_if<internal::is_string<char [17]>::value, fmt::v5::internal::char_t<char [17]>::type>::type, std::__1::char_traits<std::__1::enable_if<internal::is_string<char [17]>::value, fmt::v5::internal::char_t<char [17]>::type>::type>, std::__1::allocator<std::__1::enable_if<internal::is_string<char [17]>::value, fmt::v5::internal::char_t<char [17]>::type>::type> > fmt::v5::format<char [17], int>(char const (&) [17], int const&) in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [main] Error 1
make[1]: *** [CMakeFiles/main.dir/all] Error 2
make: *** [all] Error 2
Я не уверен, как это использовать, так как в прошлом я использовал другие библиотеки заголовков, такие как cxxopts. Любая помощь будет оценена!
3 ответа
Вы должны связать с fmt
библиотека или использовать дополнительный режим только заголовка.
Например, если у вас есть файл test.cc
:
#include <fmt/core.h>
int main() {
fmt::print("The answer is {}.", 42);
}
Вы можете скомпилировать и связать его с помощью gcc:
g++ -std=c++11 test.cc -lfmt
Я работаю на Mac, и я не понимал, что вы можете установить библиотеку, используя
brew
. Он появляется в конце страницы . Я весь вечер сталкивался с символьными ошибками и не уверен, что все мои проблемы были связаны с процессом сборки. Процесс компиляции также не работал должным образом.
Пути, по которым установлена библиотека:
/usr/local/include
а также
/usr/local/lib
.
я использую
g++-11
для сборки моего проекта, и эта инструкция работает для меня:
g++-11 -std=c++20 -I/usr/local/include -L/usr/local/lib -lfmt main.cpp -o main
Проблема только в том, что он работает частично. Он отлично работает с
print
:
fmt::print("Don't {}!\n", "panic");
Но это ломает использование
format
:
fmt::format("Don't {}!\n", "panic");
Я что-то упускаю, но не знаю, что именно.
Кстати, если вы используете VSCode, вы можете создать
c_cpp_properties.json
в ваш
.vscode
папку и добавьте путь включения для заголовков.
{
"includePath": [
[...],
"/usr/local/include/"
],
}
Не уверен, связано ли это с вашим случаем, но я надеюсь, что это поможет.
Из комментария в ответе @vitaut , если вы измените свой
#include
строка из этого:
#include "../third_party/fmt/core.h"
к этому:
#include "../third_party/fmt/format.h"
это приведет к компиляции кода в "режиме только заголовка", и вам не нужно будет изменять процесс сборки для компиляции и компоновки в библиотеке {fmt}.