Не могу понять проблему компоновщика - PullRequest
0 голосов
/ 24 апреля 2020

Обычно я могу решить проблему компоновщика, например, «неопределенную ссылку», используя nm и выяснить, что я забыл добавить исходный файл в make-файл, но здесь я не могу понять, что происходит:

$ make
gcc -I.. -I../../data_structures
-I../../iterator -I../../stack -I../../array_stack 
-Wall -Wextra -Werror  array_collection.o -o array_collection
-L.. -larray_collection
-L../../data_structures -ldyn_array
-L../../iterator -literator
-L../../stack -lstack
-L../../array_stack -larray_stack 
../../array_stack/libarray_stack.a(array_stack_init_stack.o): In function `array_stack_init_stack':
array_stack_init_stack.c:(.text+0x79): undefined reference to `stack_init'
$ nm ../../stack/libstack.a| grep stack_init
auto_stack_init.o:
0000000000000000 T auto_stack_init
0000000000000000 T stack_init

Может пожалуйста, помогите мне? Может быть, важно сказать, что команда g cc имеет псевдоним для лязга на виртуальной машине, которую я использую.

Вот код stack_init:

void    stack_init(t_stack *stack, void *realisation)
{
    stack->realisation = realisation;
    stack->_release = stack->release;
}

1 Ответ

1 голос
/ 24 апреля 2020
  1. Просто используйте путь к библиотеке stati c при компиляции. Поэтому вместо gcc -L../../stack -lstack просто используйте gcc ../../stack/libstack.a.

  2. Порядок использования библиотек stati c имеет значение. Если библиотека stati c зависит от другой библиотеки stati c, она должна идти перед ней в аргументах командной строки. Компоновщик просматривает следующие библиотеки при поиске символов, поэтому, если у вас есть libarray_stack.a, который зависит от stack.a, он должен быть после него. Если они оба зависят друг от друга, укажите их дважды (в любом случае, это хороший способ решения проблемы). Или в качестве альтернативы gcc используйте компилятор -Wl,--whole-archive. В net есть различные ресурсы, объясняющие, почему и как это происходит, например, этот поток .

  3. Возьмите более 40 лет (но все еще удивительно) ) make верните инструмент на полку и перейдите на cmake или другие системы сборки, которые решают такие проблемы (и многие другие) для вас.

Поэтому попробуйте скомпилировать с помощью:

gcc -I.. -I../../data_structures
-I../../iterator -I../../stack -I../../array_stack 
-Wall -Wextra -Werror  array_collection.o -o array_collection
-L.. -larray_collection
-L../../data_structures -ldyn_array
-L../../iterator -literator
-L../../stack -lstack
-L../../array_stack -larray_stack 
-L.. -larray_collection
-L../../data_structures -ldyn_array
-L../../iterator -literator
-L../../stack -lstack
-L../../array_stack -larray_stack 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...