Связывание нескольких сборочных файлов - PullRequest
1 голос
/ 29 июня 2019

Я пытаюсь связать основной файл сборки с внешними функциями, но продолжаю получать «неопределенную ссылку на функцию X в main».

У меня есть папка с внешними файлами, которые имеют правильные имена и являются файлами .s.

Я знаю, что у других тоже есть эта проблема, но они, кажется, в основном сосредоточены на C и файлах сборки, но это только ссылки на файлы сборки.

Это мой код при компиляции:

gcc -o main.o main.s -I lib/ -no-pie

Ошибка, возникающая при попытке компиляции:

/tmp/ccMgNx1L.o: In function `main':
(.text+0xa): undefined reference to `funcA'
(.text+0xf): undefined reference to `funcB'
(.text+0x14): undefined reference to `funcC'

Некоторая дополнительная ясность: Папка lib содержит все функции, указанные в файле main.s. Я хочу скомпилировать все файлы в исполняемый файл.

1 Ответ

3 голосов
/ 29 июня 2019

Я думаю, что вы хотите gcc -no-pie -o main main.s lib/*.s собрать все ваши исходные файлы и связать их все в один исполняемый файл.


Обратите внимание на отсутствие .o в выходном файле, потому что вы собираете+ ссылка на исполняемый файл, а не только на несвязанный объектный файл .o.

-I устанавливает путь включения для #include <> и #include "".Это совершенно не имеет значения здесь.Как и -L lib/, потому что вы не сказали gcc связать какие-либо библиотеки.Только где искать библиотеки, если вы сделали ссылку .(Но у вас нет библиотек .a или .so, у вас есть исходные файлы asm, которые еще не собраны.)

Если у вас есть main.S (заглавная S), gcc запустит егосначала через препроцессор C, чтобы вы могли #include "foo.s" в основном для всех функций, которые вы фактически используете.И -I для установки пути включения не потребует #include "lib/foo.s"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...