Как добавить сторонние библиотеки для сборки с g ++ на Windows cmd? - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь создать приложение C ++ с SDL. Мой план был статически связать библиотеку, поэтому мне не нужно иметь дело с DLL. (мой предыдущий вопрос: С чего начать развертывание кода C ++? ). И я выполняю следующие шаги: Как я могу статически связать стандартную библиотеку с моей программой на С ++? )

Возможно, я должен как-то указать компилятору, где искать библиотеки, но я не не знаю, как это сделать.

Я пытался g++ -B <path> -c -Wall main.cpp

Но он по-прежнему жалуется, что не может найти SDL.h (путь выше указывает на папку, содержащую SDL.h).

Я посмотрел для опции -B из меню справки и, вероятно, неправильно ее использовать.

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

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

1 Ответ

0 голосов
/ 04 апреля 2020

Компиляция кода C / C ++ - довольно большая тема c, поэтому я определенно рекомендую вам также прочитать учебник, подобный этому: https://www.geeksforgeeks.org/compiling-with-g-plus-plus/ и https://courses.cs.washington.edu/courses/cse373/99au/unix/g++.html.

Но в любом случае:

Это пример проекта, который использует библиотеку libFoo и включает несколько заголовочных файлов из этой библиотеки:

Myproject:
   - Main.cpp
   - ClassFoo.cpp
   - ClassFoo.hpp

Часть ClassFoo. cpp:

#include "AClassFooHeader.hpp"

ClassFoo::myFunc() {
   foo.execute(); // execute a random function in the libFoo library
}

Теперь предположим, что мы хотим скомпилировать этот проект, какую команду нам нужно выполнить?

Итак, первая часть - это компиляция проекта. В основном мы преобразуем исходные файлы в объектные файлы. После этого мы свяжем их вместе в приложении (вместе с библиотекой).

Допустим, мы запустили эту команду:

g++ -c Main.cpp ClassFoo.cpp

Мы получим ошибку включения, например: «не могу найти AClassFooHeader.hpp». Это почему? Что ж, компилятор ищет в некоторых предопределенных местах файлы заголовков, но наша библиотека не находится в предопределенном месте, поэтому он не может найти файл заголовков. Как мы можем решить это?

g++ -I/path/to/lib/folderHeader -c Main.cpp ClassFoo.cpp

Итак, теперь мы включили путь к файлу, чтобы компилятор знал, где найти AClassFooHeader.hpp

Но теперь нам также нужно связать объекты вместе в приложении. Без библиотеки это можно сделать с помощью:

g++ -o application.exe Main.o ClassFoo.o

Поэтому мы связываем файлы .o в приложении (называемом application.exe)

Но теперь нам также нужно связать нашу библиотеку , Это можно сделать с помощью:

g++ -o application.exe Main.o ClassFoo.o -L/path/to/lib/folderLibrary -lFoo

Где -L - это место, где хранится библиотека, а -l - это имя библиотеки минус lib, например, libFoo -> -lFoo

Это также можно сделать за один шаг:

g++ -o application.exe -I/path/to/lib/folderHeader Main.cpp ClassFoo.cpp -L/path/to/lib/folderLibrary -lFoo
...