Я перемещаю проект 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:
#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.
Я бы не рекомендовал писать собственные Makefile
. Вместо этого используйте систему сборки, например CMake или SCons.
Стоит отметить, что эти инструменты являются кроссплатформенными. Таким образом, вы можете использовать одну и ту же систему сборки в Linux и Windows.
Конечно, вам следует прочитать 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. Если вы наберете «сделать очистку», она запустит команду.
Конечно, есть масса других вариантов, но с этого стоит начать.
Ниже приведен очень простой 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
Это не совсем то, что вы просили, но я настоятельно рекомендую вам использовать систему сборки под названием premake. Преимущество и различие между premake, scons и cmake заключается в том, что они генерируют make-файлы для вас. Это означает, что вы можете использовать premake для начала, а затем просмотреть файлы, которые он генерирует, чтобы узнать больше.
Помимо этого premake — это простой в освоении и интуитивно понятный инструмент, который имеет дополнительное преимущество — возможность создавать файлы проекта Visual Studio из той же конфигурации.
Я бы посоветовал использовать premake, если вам абсолютно необходимо иметь make-файлы, это поможет вам учиться и, в конечном счете, является гибкой заменой непосредственного написания ваших собственных make-файлов (главная проблема — %*$).
Используя идею @Job, я рекомендую оставить ее для какой-нибудь IDE. Например, создайте проект в Eclipse CDT и используйте его автоматически сгенерированный make-файл. Затем вы можете выучить его и со временем изменить в соответствии с вашими потребностями.