Сокращение команды сборки

Linux Mint основан на Ubuntu, можно установить пакеты из репозиториев Ubuntu. Вам, вероятно, придется изменить Ваш /etc/apt/sources.list если Вы не можете найти пакет в менеджере по программному обеспечению.

IcedTea находится в репозитории Вселенной, который должен быть включен по умолчанию. Можно также найти соответствующие пакеты путем поиска Ubuntu repos.

3
27.01.2014, 16:58
3 ответа

make инструмент, в котором Вы нуждаетесь. Просто необходимо ввести make с Makefile на месте и Ваш файл будет сборкой.

Вот простой Make-файл, который генерировал бы файл newFileName согласно строке Вы отправили в вопросе:

MYFLAGS=$(shell pkg-config --cflags --libs opencv)

newFileName: file.cpp
    $(CXX) $< -o $@ $(MYFLAGS)

При размещении этого в каталог кода просто введите make и Ваш код будет сборкой.

Краткое объяснение:

  • make будет искать Make-файл в каталоге;
  • Поскольку файл там, make выполнит первое правило: newFileName, и выполняют его;
  • Этот синтаксис правила следующий:
    • newFileName: определяет имя правила или цель, предпочтительно название файла, что правило будет roduce;
    • Все после : предпосылки, другими словами, файлы, которые будут необходимы для выполнения рецепта этого правила или правил, которые должны быть выполнены прежде;
    • Рев строки (строк) является рецептом (заметьте или 4 пробелов в начале строки), они говорят, делают, как произвести файл newFileName.
  • $(CXX) расширится до Вашего компилятора C++ по умолчанию и MYFLAGS расширится до вывода pkg-config --cflags --libs opencv.

Премия: Составьте завещание, выполняют рецепт правила, только если предпосылки были изменены после метки времени создания цели, поэтому если Вы вводите make и у Вас уже есть актуальный newFileName файл, Вы, привычка потеряла время, перекомпилировав что-то, что Вы уже имеете. Это специально хорошо, когда у Вас есть много файлов.

3
27.01.2020, 21:11

Раньше Вы учитесь использовать make лучше. Создайте a makefile в том же каталоге как file.cpp - остерегайтесь делают, требует, чтобы использование фактической вкладки сделало отступ. При использовании пробелов Вы получите "недостающий разделитель" ошибка:

OPENCV=`pkg-config --cflags --libs opencv`

newFileName: file.cpp
    $(CXX) -o newFileName file.cpp $(OPENCV)

Для создания просто работайте make в том каталоге. Это проверит правило на первую цель в make-файле. В этом случае существует только один, newFileName цель. С тех пор file.cpp предпосылка, если файл с целевым именем не существует, или это существует, но время изменения предпосылки является более новым (т.е. Вы изменили file.cpp с тех пор newFileName был в последний раз создан), рецепт будет выполняться.

Удостоверяться $(CXX) определяется в Вашей системе, выполняется make -p | grep CXX в каталоге без make-файла. Вывод должен включать CXX = g++.


Если Вы добавляете другую цель, например:

otherFile: file2.cpp
    $(CXX) -o otherFile file2.cpp $(OPENCV)

Можно выполнить это правило при помощи целевого имени, make otherFile. Снова, если никакая цель не дана, первый в make-файле используется.

Так как те две цели следуют за идентичным шаблоном при использовании исполняемых имен, которые соответствовали именам исходного файла, Вы могли сделать это:

%: %.cpp
    $(CXX) -o $* $*.cpp $(OPENCV)

Теперь, make whatever будет работать

g++ -o whatever whatever.cpp `pkg-config --cflags --libs opencv`

Посмотрите, Как Соответствие Шаблонов и Автоматические переменные для объяснения того, как это работает.


Сделайте становится особенно полезным, поскольку Вы начинаете делать более сложные вещи - компилирующий объект (.o) файлы и объединение их в исполняемые файлы, и т.д. В конечном счете, необходимо будет учиться использовать некоторую систему сборки, и make наиболее распространенный в *, отклоняют мир.

3
27.01.2020, 21:11
  • 1
    Когда я пытаюсь выполнить команду make SURF_detector surfPoints.cpp это дает сообщение: make: *** No rule to make target SURF_detector'. Остановитесь'. Мой make-файл: %: %.cpp $(CXX) -o $* $*.cpp $(OPENCV) –  Colin747 27.01.2014, 16:24
  • 2
    Поскольку при использовании того правила, необходимо также использовать исполняемые имена, которые соответствуют названию исходного файла. Так make surfPoints скомпилировал бы surfPoints.cpp в исполняемый файл surfPoints. Вы не можете заполнить prereq на командной строке - каждый аргумент будет взят в качестве цели - поэтому, если будет нет SURF_detector.cpp та команда приведет тот путь к сбою. Если Вы хотите использование произвольные исполняемые имена, которые не соответствуют имени исходного файла, необходимо будет использовать определенное пользовательское правило согласно первому примеру. –  goldilocks 27.01.2014, 16:36
  • 3
    Ahh OK, у меня есть другая проблема, когда я работаю make surfPoints, это производит длинный список ошибок, но я могу скомпилировать файл сам, если я вручную ввожу команду. Я обновлю свой вопрос, таким образом, это будет читаемо. –  Colin747 27.01.2014, 16:40
  • 4
    Хм. OPENCV='pkg-config foobar --cflags --libs' (где ' на самом деле обратная галочка), работы для меня с другим материалом pkg-конфигурации, но Вы могли попробовать RSFalcon7, предложил OPENCV=$(shell pkg-config --cflags --libs opencv). –  goldilocks 27.01.2014, 16:54

У Вас есть 3 опции для сокращения вещей в типичной оболочке, таких как Bash.

  1. Сделайте сценарий оболочки
  2. Сделайте псевдоним
  3. Сделайте функцию

Я покажу Вам 2 и 3.

псевдоним

Вы могли сделать что-то вроде этого как псевдоним.

$ alias mygcc='g++ file.cpp -o newFileName $(pkg-config --cflags --libs opencv)'

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

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

$ alias myalias='ls -l'

$ myalias -d
drwxrwxr-x. 2 saml saml 4096 Jan 24 11:19 .

$ myalias file1
-rw-rw-r--. 1 saml saml 0 Jan 24 11:19 file1

Таким образом, когда мы работаем myalias мы можем дать ему имена файлов или другие переключатели, и это работает.

функция

Функции могут сделать намного больше. Можно вставить вещи здесь как проверка ошибок или выполнить некоторую другую команду и сохранить ее результаты в переменной. Так делая это функция позволила бы Вам, управляют аргументами в строке.

$ mygcc () { g++ file.cpp -o newFileName $(pkg-config --cflags --libs opencv); }

Выход за пределы?

Если бы Вам нужны больше, чем просто простая острота затем, я убедил бы Вас изучить использование надлежащего инструмента те, которые Делают, CMake или любое из несметного числа инструментов разработки зависимости.

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

2
27.01.2020, 21:11
  • 1
    Не делайте. Используйте инструмент для задания, т.е. некоторое основанное на зависимости оборудование сборки. –  vonbrand 24.01.2014, 19:31
  • 2
    @vonbrand - перечитывают мой A: "У Вас есть 3 опции для сокращения вещей в типичной оболочке, таких как Bash". Я только обращался к его Q о том, как можно было бы сократить единственную команду. Я не добирался, мыльница о Делают, Cmake, etc.etc. Существует любое количество инструментов, которые он мог использовать здесь, но это не было тем, что он просил! –  slm♦ 24.01.2014, 19:34
  • 3
    , я действительно читал его. И Вы отвечаете на вопрос, но даете нерешения "сборки пакет надежно" проблема. –  vonbrand 24.01.2014, 19:53
  • 4
    @vonbrand - достаточно ярмарка, я с тех пор добавил раздел по инструментам сборки. –  slm♦ 24.01.2014, 19:57

Теги

Похожие вопросы