Ошибка компоновщика: неопределенная ссылка на fdt_path_offset

Я пытаюсь использовать libfdt для анализа файлов больших двоичных объектов дерева устройств.

Вы можете установить libfdt на любой Ubuntu: sudo apt-get install libfdt-dev

Я пишу простую тестовую программу для использования одного из API:

#include <vector>
#include <iostream>
#include <libfdt.h>
#include <fstream>

std::vector<char>
read_binary(const std::string& fnm)
{
  if (fnm.empty())
    throw std::runtime_error("No file specified");

  // load the file
  std::ifstream stream(fnm);
  if (!stream)
    throw std::runtime_error("Failed to open file '" + fnm + "' for reading");

  stream.seekg(0, stream.end);
  size_t size = stream.tellg();
  stream.seekg(0, stream.beg);

  std::vector<char> binary(size);
  stream.read(binary.data(), size);
  return binary;
}

int main ()
{
  std::vector<char> binary = read_binary("metadata.dtb");
  const void* fdt = binary.data();
  int offset = fdt_path_offset(fdt,"/interfaces");
  std::cout << offset << std::endl;
  return 0;
}

Я компилирую/связываю с:

g++ main.cpp -lfdt

Компиляция прошла успешно, но линковка не удалась. Я не понимаю, почему. Я вижу, что в библиотеке есть символы. Библиотека существует в пути поиска по умолчанию. Компоновщик может найти библиотеку.

Ошибка линкера:

main.cpp: undefined reference to `fdt_path_offset(void const*, char const*)'

person WilderField    schedule 03.09.2020    source источник


Ответы (1)


libfdt — это программное обеспечение C, которое не заботится о C++.

Функции, написанные на C, должны быть объявлены с extern "C", чтобы их можно было использовать в C++. Во многих библиотеках C заголовки, обращенные к пользователю, заключены в

#ifdef __cplusplus
extern "C" {
#endif

// declarations ...

#ifdef __cplusplus
}
#endif

для удобства разработчиков C++.

Однако libfdt, по-видимому, этого не делает, так что вам придется сделать это самостоятельно.

extern "C" {
    #include <libfdt.h>
}

должен сделать трюк.

person n. 1.8e9-where's-my-share m.    schedule 03.09.2020
comment
Спасибо @n-местоимения-м !! Я заметил, что API теперь завернуты в extern "C" в последней версии libfdt. Мне просто не повезло, что этого исправления не было в упакованной версии Ubuntu. Если я устанавливаю libfdt из исходников, он работает! Спасибо за ответ, теперь я знаю, что нужно следить за этим в будущем. Изменение имени 101! - person WilderField; 03.09.2020