Создать файл make / build для linux

Я перемещаю проект C ++ из Windows в Linux, и теперь мне нужно создать файл сборки / сборки. Я никогда раньше не создавал файл build / make. Мне также нужно включить библиотеки Boost, чтобы усложнить задачу. Это также должен быть make-файл, и мне все равно нужно научиться создавать make-файл, поэтому CMake и SCON отсутствуют. IDE также отсутствуют из-за использования Boost, и все мои IDE (Eclipse, VS и т. Д.) Работают только в Windows. Я должен создать make-файл с нуля.

Итак, каковы основы создания файла make для Linux c ++ и как включить в него библиотеки Boost, чтобы он правильно компоновался?

Пока что мой make-файл выглядит так. Я думаю, что CFLAGS и LDFLAGS являются параметрами компилятора и оптимизации, но не совсем уверены.

CC = g++
CFLAGS = -wall -o3 - c
LDFLAGS = -03 -mfp-rounding-mode=n

Я предлагаю награду, потому что я все еще очень потерян. Если кто-то любит приключения, мне нужно скомпилировать следующее в linux

  • simple_ls.h
  • simple_ls.cpp
  • 2dquicksort.h
  • rawr.h
  • rawr.cpp
  • converter. cpp

Заголовки в simple_ls.h:

#include "boost/filesystem/operations.hpp"
#include "boost/filesystem/path.hpp"
#include "boost/lexical_cast.hpp"

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

Заголовки в 2dquicksort.h:

#include <stdio.h>
#include <ctype.h>
#include <iostream>

Заголовки в rawr.h:

#include <iostream> // not required by most systems
#include <fstream>
#include <iomanip>
#include <cstdlib> // or (stdlib.h) for exit()

#include <cmath> 
#include <vector>
#include <limits>
#include <string>

Приемлемым ответом было бы пошаговое объяснение того, как работают make-файлы и как собрать их с помощью Boost в Linux без IDE.

10
задан Yi Jiang 4 September 2010 в 02:35
поделиться

5 ответов

Я бы не рекомендовал писать собственные Makefile. Вместо этого используйте систему сборки, например CMake или SCons.

Стоит отметить, что эти инструменты являются кроссплатформенными. Таким образом, вы можете использовать одну и ту же систему сборки в Linux и Windows.

8
ответ дан 3 December 2019 в 13:16
поделиться

Конечно, вам следует прочитать The Fine Manual (особенно gcc и make). Тем не менее, вот основы для gcc:

Чтобы скомпилировать исходный файл:

g++ -c file.cpp

Это создаст файл .o. Тогда вы, вероятно, захотите связать их:

g++ -o app_name file.o main.o other_file.o

Это создаст исполняемый файл с именем имя_приложения. Но поскольку вы используете boost и файлы заголовков могут быть расположены повсюду, вам, вероятно, потребуются дополнительные параметры. Используйте -I во время компиляции, чтобы добавить каталог в путь включения:

g++ -I/usr/local/more_includes/ -c file.cpp

Возможно, вам также потребуется создать ссылку на некоторые библиотеки. Во время линковки:

g++ -L/usr/local/more_libraries/ file.o main.o other_file.o -lsome_library

Теперь мейкфайлы. Основы make-файла таковы:

target: dependencies
    command

Например:

my_app: file.o
    g++ -o my_app file.o

file.o: file.cpp file.h
    g++ -o file.cpp

clean:
    rm file.o my_app

Если вы наберете 'make', по умолчанию будет попытка создать первую цель. my_app зависит от целевого файла file.o, поэтому он проверит, был ли изменен file.o с момента последнего изменения my_app. Если это так, он будет перелинкован. При проверке file.o он замечает, что file.o зависит от file.cpp и file.h. Если какой-либо из этих файлов был изменен с момента последнего создания file.o, он перекомпилирует этот файл.

Цели не всегда должны быть настоящими файлами. Последний называется чистым, он ни от чего не зависит и просто удаляет file.o и my_app. Если вы наберете «сделать очистку», она запустит команду.

Конечно, есть масса других вариантов, но с этого стоит начать.

5
ответ дан 3 December 2019 в 13:16
поделиться

Ниже приведен очень простой make-файл GNU:

CPPFLAGS += -Isome_include_path
CXXFLAGS += -O3
LDFLAGS  += -Lsome_link_path -lsome_lib -lboost_filesystem

all: binary_name
binary_name: foo.o bar.o john.o
  • CPPFLAGS — это флаги, которые применяются к препроцессору C. Такие вещи, как включение путей.
  • CXXFLAGS — это флаги, применяемые к компилятору C++. Такие вещи, как уровни оптимизации.
  • LDFLAGS — это флаги, применяемые к компоновщику. Такие вещи, как внешние библиотеки (boost_filesystem) и другие библиотеки. Также пути к этим библиотекам.
  • Конвенция гласит, что должно быть правило сделать все, которое используется по умолчанию. В make первое правило используется по умолчанию.
  • binary_name — это имя вашего двоичного файла.
  • binary_name зависит от 3 файлов: foo.o, bar.o, john.o.
  • Мы не включаем правила для *.o, потому что gnu make имеет для них неявное правило.

Чтобы использовать make, вы должны создать файл с именем Makefile с указанным выше содержимым. Для сборки вы должны запустить make в этом каталоге.

В качестве отступления (и как уже упоминалось другими), я бы рекомендовал по возможности отказаться от make. Есть более совершенные системы. Главное преимущество make в том, что он везде. Однако если этого требует менеджмент, значит, этого требует менеджмент.

(Обратите внимание, что нотация GNU Make += не всегда переносима на другие версии Make. Однако make в Linux — это GNU Make.)


Учитывая ваше редактирование , вот пример с файлами, которые вы отметили.Единственное предостережение: строка, начинающаяся с $(CXX), должна начинаться с символа TAB!

LDFLAGS  := -lboost_filesystem
CXXFLAGS := -O3 -Wall
CPPFLAGS :=

all: program
program: simple_ls.o converter.o rawr.o
    $(CXX) -o $< $^ $(LDFLAGS)

simple_ls.o: simple_ls.cpp rawr.h simple_ls.h 2dquicksort.h
converter.o: converter.cpp rawr.h simple_ls.h 2dquicksort.h
rawr.o: rawr.cpp rawr.h simple_ls.h 2dquicksort.h
19
ответ дан 3 December 2019 в 13:16
поделиться

Это не совсем то, что вы просили, но я настоятельно рекомендую вам использовать систему сборки под названием premake. Преимущество и различие между premake, scons и cmake заключается в том, что они генерируют make-файлы для вас. Это означает, что вы можете использовать premake для начала, а затем просмотреть файлы, которые он генерирует, чтобы узнать больше.

Помимо этого premake — это простой в освоении и интуитивно понятный инструмент, который имеет дополнительное преимущество — возможность создавать файлы проекта Visual Studio из той же конфигурации.

Я бы посоветовал использовать premake, если вам абсолютно необходимо иметь make-файлы, это поможет вам учиться и, в конечном счете, является гибкой заменой непосредственного написания ваших собственных make-файлов (главная проблема — %*$).

2
ответ дан 3 December 2019 в 13:16
поделиться

Используя идею @Job, я рекомендую оставить ее для какой-нибудь IDE. Например, создайте проект в Eclipse CDT и используйте его автоматически сгенерированный make-файл. Затем вы можете выучить его и со временем изменить в соответствии с вашими потребностями.

0
ответ дан 3 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

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