Найдите неразрешенные зависимости библиотеки stati c перед компоновкой исполняемого файла - PullRequest
0 голосов
/ 26 мая 2020

Допустим, у нас есть stati c библиотека mylib.a, которая содержит скомпилированные cpp файлы.

file1. cpp:

int do_stuff();

int func_unres()
{
  int a = do_stuff();
  return a;
}

файл2. cpp:

int do_other_stuff();

int func_res()
{
  int a = do_other_stuff();
  return a;
}

файл3. cpp:

int do_other_stuff()
{
  return 42;
}

Итак, как мы видим здесь нет файла, содержащего определение функции do_stuff. Библиотека создана таким образом:

g ++ - c file1. cpp -o file1.o

g ++ - c file2. cpp -o file2.o

g ++ - c file3. cpp -o file3.o

ar r mylib.a file1.o file2.o file3.o

Теперь попробуем сделать с этой библиотекой какой-нибудь двоичный файл. Простой пример основного файла:

#include <iostream>

int func_res();

int main()
{
  std::cout << func_res() << std::endl;
}

Компиляция:

g ++ main. cpp mylib.a -o my_bin

Все работает отлично . Теперь рассмотрим пример основного файла:

#include <iostream>

int func_unres();

int main()
{
  std::cout << func_unres() << std::endl;
}

В этом случае двоичный файл не будет связываться, потому что func_unres требует, чтобы функция do_stuff была определена.

Есть ли способ чтобы узнать, что библиотека stati c требует символа, которого нет в объектном файле в библиотеке, прежде чем связывать его с исполняемым файлом, который использует такой символ?

EDIT: вопрос не в том, как просто перечислить такие символы, но получить вывод с ошибкой компоновщика. Например, если бы я связал эту библиотеку с исполняемым файлом, используя все символы, которые он должен содержать.

1 Ответ

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

Кажется, что, как указано в комментариях и в Как заставить g cc связать неиспользуемую stati c библиотеку , параметр компоновщика --whole-archive достаточно для принудительного разрешения всех символов и вывода компоновщика ошибка для всех неразрешенных символов в библиотеке stati c. Поэтому, ссылаясь на примеры вопросов, компилируя и связывая таким образом первый основной файл, который не ссылается на неопределенный символ, все равно будет выводить ошибку компоновщика:

g ++ main. cpp -Wl, - целый -archive mylib.a -Wl, - no-all-archive

Связывание не удается, несмотря на то, что main не использует func_unres:

mylib.a (file1 .o): В функции func_unres (): file1. cpp :(. text + 0x9): undefined ссылка на do_stuff ()

Второй параметр --no-whole-archive используется, поэтому остальная часть требуется символы библиотек не будут принудительно разрешены таким образом.

...