Связывание ошибок с помощью fmt: неопределенная ссылка на `std :: string fmt :: v6 :: internal :: grouping_impl <char>(fmt :: v6 :: internal :: locale_ref) ' - PullRequest
2 голосов
/ 04 мая 2020

В нашем проекте мы решили использовать последнюю версию fmt (6.2.0) в нашем проекте и использовать в основном функциональность printf, так как у нас было ведение журнала, где мы широко используем printf.

Я построил libfmt.a в нашей коробке Linux с использованием CMakeLists.txt, включенного в пакет fmt. В моем процессе я включил каталог включения libfmt и в target_link_libraries. В коде я использовал только #include<fmt/printf.h>. Теперь, когда я компилирую код, код компилируется, но во время компоновки я получаю ошибки: их намного больше, но следующее - первое, и я верю, что если это будет решено, остальные будут разрешены автоматически

.
*

AB 1020 * cpp :( text._ZN3fmt2V68internal8groupingIcEESsNS1_10locale_refE [_ZN3fmt2v68internal8groupingIcEESsNS1_10locale_refE] + 0х20):. неопределенный правочник для `станд :: строки FMT :: v6 :: внутренняя :: grouping_impl (FMT :: v6 :: internal :: locale_ref) '

Я провел некоторый анализ и обнаружил, что определение этой функции присутствует в format-inl.h. Я попытался включить его в свой код, но все еще оставалась проблема с линковкой.

Теперь, когда я определил макрос FMT_HEADER_ONLY в коде, линковка сработала.

Мой вопрос : Когда я связываюсь с библиотекой libfmt.a, она не может найти эту функцию. Почему? Я не хочу использовать версию только для заголовков.

Пожалуйста, дайте мне знать, как это исправить.

1 Ответ

1 голос
/ 05 мая 2020

Важен порядок связывания (см. { ссылка }). Обязательно передайте библиотеку после исходного или объектного файла, который ее использует. Например:

git clone https://github.com/fmtlib/fmt.git
cd fmt
make fmt
cat <<EOF > test.cc
#include <fmt/printf.h>

int main() {
  fmt::printf("Hello, %s!", "world");
}
EOF
g++ test.cc -L. -lfmt -Iinclude
./a.out

Этот пример извлекает {fmt} из github, компилирует его, создает небольшой тестовый источник, компилирует и запускает его, получая следующий вывод:

Hello, world!

Если вы передадите -lfmt до test.cc, и вы получите ошибки компоновки.

Я рекомендую использовать CMake, который позаботится о вашем порядке компоновки: https://fmt.dev/latest/usage.html#usage -with-cmake

...