Скомпилируйте все необходимые файлы с помощью gcc - PullRequest
2 голосов
/ 08 мая 2019

Я новичок в C и компиляторе gcc. У меня есть проект, в который я включаю некоторые другие файлы .h. В эти файлы входят файлы из более собственных .h. И так далее. Приличное количество включает в себя. Моя проблема, когда я пытаюсь скомпилировать основной файл с:

gcc -o test tests_main.c

Я получаю следующую ошибку:

Undefined symbols for architecture x86_64:
 "_waves_secure_hash_test", referenced from:
     _crypto_tests in tests_main-d1ae56.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Это потому, что компилятор не может найти метод "waves_secure_hash_test", но он находится во включенном файле:

#include "crypto_tests.h" 

Итак, я немного искал и нашел решение, просто скомпилировал его:

gcc -o test tests_main.c crypto_tets.c

Хорошо, это работает для меня с этим двумя тестовыми файлами, где функции - это только некоторые тестовые распечатки. Для моего полного проекта с приличным количеством включений я не могу записать все эти c-файлы для компиляции ... Есть ли способ сообщить компилятору, что он должен скомпилировать все необходимые и включенные файлы?

1 Ответ

5 голосов
/ 08 мая 2019

Вы смешиваете включенные файлы (.h файлы, заголовочные файлы) и исходные файлы (.c файлы).Вам не нужно ничего делать с заголовочными файлами, компилятор обработает их автоматически (1) .

Вы do должны перечислить все исходные файлы, которые выхочу компилировать. Это то, что определяет ваш проект.Основываясь на исходной структуре дерева, вы можете использовать расширение шаблона оболочки (например, *.c), чтобы получить их.

Для более крупных проектов вы обычно не вводите команду компиляции вручную,но используйте какой-либо инструмент управления проектами, такой как IDE, Makefile или генератор системы сборки, такой как CMake.

Также обратите внимание, что ошибка, которую вы на самом деле получаете, не является compiler error, это компоновщик ошибка.Связывание - это отдельный шаг после компиляции.Компиляция читает исходные файлы и создает объектные файлы.Связывание затем считывает объектные файлы и создает двоичный файл (исполняемый файл или совместно используемую библиотеку) из них.

Следует также отметить, что не всегда существует соответствие 1: 1 между заголовочными и исходными файлами.Классическим примером являются библиотеки: вы можете включить один или несколько файлов заголовков, которые поставляются с внешней библиотекой;они будут предоставлять объявления для функций, реализованных внутри этой библиотеки.Это позволяет вам вызывать функции в вашем коде.Чтобы затем сделать эти функции доступными для компоновщика (чтобы они могли стать частью вашей программы), попросите компоновщика связать библиотеку с вашим двоичным файлом (обычно с помощью параметра командной строки -l).


(1) Возможно, вам все равно придется указывать вашему компилятору каталоги, в которых находятся эти заголовочные файлы, что обычно делается с помощью параметра командной строки -I.

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