Проблема в том, что после долгой битвы с загрузкой библиотеки, которую я пытаюсь использовать, после установки компилятора, создания файла и поиска правильной команды для запуска и включения путей, которые я получаю неопределенная ссылка на ошибки.
Уже имеется множество вопросов и ответов о SO, относящихся к таким проблемам, особенно Что такое неопределенная ссылка / нерешенная внешняя ошибка символа и как ее исправитьэто?
Возможные исправления, которые я нашел:
- Ссылка .cpp файлы в строгом порядке, когдасоставление:
sudo g++ main1.cpp main2.cpp
- [ТАК вопрос с ответами, примерно такими же, как и предыдущий]
Обычно не имеет значения.Хотя link порядок различных объектов / библиотек является существенным, это редко влияет на случай, когда все необходимые исходные файлы C и / или C ++ указаны в одной и той же команде компиляции.
Использование make
по сути не решает проблему, и, конечно, не обязательно длярешение проблемы.Написание make-файла, который обеспечивает успешную сборку, будь то напрямую или с помощью инструмента сборки, такого как CMake или Autotools, требует от вас хотя бы на высоком уровне понимания того, как работают компиляторы и компоновщики, каковы их входы и выходы и каковы ихЗначения аргументов и опций.
- Какие файлы cpp связать, если у меня есть только один?
Вы не связываете .cpp
(напрямую) вообще.Вы компилируете его и связываете результат с любыми необходимыми библиотеками и любыми другими объектами.g++
по умолчанию попытается сделать все это за один шаг, и в этом случае процесс обычно называется «компиляцией», а не «компоновкой», даже если обе функции выполняются.g++
можно сделать только для компиляции без привязки, указав для нее опцию -c
(как это обычно бывает в make-файлах), и она с радостью будет связывать объекты и библиотеки без компиляции, если вы неНазовите ему любые исходные файлы.
В любом случае, ваш случай совсем не относится к одному .cpp
файлу.Это ваш .cpp
файл плюс всех библиотек, которые вы пытаетесь использовать.
- Нужно ли связывать все файлы .cpp и .h, которые есть в библиотеке?
Вам не нужно компилировать (напрямую) или ссылка на любые файлы .h.Но если вы хотите использовать библиотеку, исходники которой вы скачали, вам do необходимо скомпилировать все источники, и вам, вероятно, следует связать их в реальную библиотеку.Кроме того, если вы не создаете и не используете статическую библиотеку, вам также следует установить библиотеку, которую вы строите.Похоже, что исходные тексты библиотеки включают в себя make-файл, поэтому вам рекомендуется использовать make
для выполнения этих шагов.
- Я ничего не понимаю в makefile или в том, почему он вообще существует.
Makefile - это входные данные для make
.Хорошо написанный определяет правила для того, как построить одну или более "целей", и выражает предпосылки (обычно исходные источники или другие цели) для этого.make
использует их вместе с набором встроенных правил, чтобы выяснить, какие шаги нужно предпринять, чтобы построить цели, которые вы просите его построить, а также какие шаги он может пропустить.Например, обычно пишут make-файлы, так что если вы создаете проект с несколькими источниками, изменяете только один исходный файл, а затем снова собираете, только измененный исходный код перекомпилируется.
Это может показаться тривиальным, когда вы привыкли к проектам с небольшим количеством источников, но это становится важным в более крупных проектах, где полная перестройка стоит дорого - в некоторых случаях много часов.Но даже если полная сборка занимает всего несколько минут, а если вам действительно нужно было потратить всего несколько секунд, то это в целом тратит впустую время за полный рабочий день.
В целом, тогда:
Когда мне нужно использовать / иметь make-файл?
Никогда.Но предоставление хорошего и использование make
для сборки вашего проекта имеет следующие преимущества:
- , запоминающий все необходимые команды сборки, включая опции и аргументы, в постоянной, действенной форме и, следовательно,
- , обеспечивающий согласованные автоматические сборки.
Это также может быть достигнуто простым сценарием сборки, но make
также может дать вам
- более быстрая сборка за счет создания только тех частей, которые устарели, и
- встроенных знаний о том, как строить определенные виды целей из соответствующих источников.