2016-02-29 2 views
2

При составлении приложения SFML,Компиляция SFML на Linux (Ubuntu)

  • мне нужно сначала создать файл CPP с кодом SFML и сохранить файл
  • Затем написать команду: g++ -c main.cpp для компиляции и создания файл объекта.
  • Наконец, чтобы создать SFML приложение, мне нужно написать команду:
    g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system

Я был успешно скомпилировать и запустить свое первое приложение, но мы не можем сократить этот процесс, я имею в виду сделать Я должен набирать это каждый раз при компиляции и приложению?

У меня есть этот вопрос и о компиляции файлов C++ в целом. Каждый раз мне приходится писать g++ filename.cpp -o filename. Как я могу сократить этот процесс? Спасибо.

+4

см. Инструмент построения автоматизации, например make, cmake ... – Garf365

+0

@ Garf365: произнесите еще несколько слов и опубликуйте его как ответ – Ionut

+0

@ Ionut это сделано, если у вас есть обратная связь, дайте, не стесняйтесь;) – Garf365

ответ

5

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

Так что если вы переименовать файл main.cpp в sfml-app.cpp, а затем создать файл с именем Makefile и скопировать этот текст в него:

# optional flags (if the compiler supports it) 
CXXFLAGS += -std=c++11 

# HIGHLY RECOMMENDED flags 
CXXFLAGS += -Wall -Wextra -pedantic-errors 

# required for SFML programs 
LDLIBS := $(shell pkg-config sfml-all --libs) 

# The rest will turn any source file ending in .cpp 
# into a program of the same name 

SOURCES := $(wildcard *.cpp) 
PROGRAMS := $(patsubst %.cpp,%,$(SOURCES)) 

all: $(PROGRAMS) 

clean: 
    rm $(PROGRAMS) 

Тип: make строить программы и make clean, чтобы удалить их.

Примечание: Отступ rm $(PROGRAMS) команды должен быть TAB, а не пространства.

Если вы хотите скомпилировать другую программу в том же каталоге, просто создайте другой исходный файл в каталоге another-app.cpp, а make автоматически превратит его в программу.

Этот Makefile превратит любой исходный файл (заканчивающийся на .cpp) в программу с таким же именем.

Примечание: Если вы хотите создавать большие, многофайловые программы, вам понадобится другой Makefile. Если вы серьезно относитесь к программированию, то вы должны узнать make.

Здесь вы можете learn all about make.

+0

Спасибо! У меня возникла проблема при вводе 'make main.cpp' в терминал, я получаю ошибку' Makefile: 19: *** missing separator. Stop.' – samjoe

+0

Спасибо, я исправил его! Это было связано с использованием пробелов, а не вкладок! Большое спасибо! – samjoe

2

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

g++ -c main.cpp 
g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system 
+0

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

1

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

Personnaly, для небольшого проекта, я использую Make. Вы пишете файл, называемый Makefile, правила, которые определяют отношение между файлами и как реализовать каждый шаг. Например, минимальный Makefile для вашего проекта будет:

sfml-app: main.o 
    g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system 

main.o: main.c 
    g++ -c main.cpp 

Этот файл находится в корневом каталоге проекта. Вам просто нужно ввести команду «make» для запуска сборки. Если вы хотите, вы найдете много документации в Интернете. см. https://en.wikipedia.org/wiki/Make_%28software%29 Я рекомендую вам прочитать о makefile, чтобы использовать его правильно и иметь возможность использовать его силу.

Кроме того, кто-то может посоветовать вам использовать другой инструмент автоматизации сборки: это индивидуальный выбор! Здесь вы найдете список существующих инструментов (не исчерпывающий): https://en.wikipedia.org/wiki/List_of_build_automation_software

+0

Плохой 'Makefile'; следует использовать стандартные переменные ('COMPILE.cc',' CXXFLAGS'); см. правила по умолчанию, заданные с помощью 'make -p'. И вы всегда * должны вызывать 'g ++' с '-Wall -Wextra' и, возможно, также' -g' –

+4

** Плохой ** слишком суровый, это минимальный рабочий Makefile, который решает проблему. В этой ситуации я думаю, что это более подходит для тех, кто не слышал о Make before, потому что это легче понять, чем * good * Makefile. Если OP хочет, он может прочитать документы и научиться писать хорошие Make-файлы, но он может быть более склонным к этому, если он сможет понять основы, не предварительно прочитав полный справочник Make. – Ionut

+0

@BasileStarynkevitch Я согласен с вами, мы должны использовать стандартные переменные, я также согласен с флагами C++. Я использую это. Но это не вопрос. Кроме того, я просто даю предварительный просмотр инструмента автоматизации сборки среди многих других. Для этого я рекомендую прочитать в Интернете какую-то документацию! – Garf365

0

Вот сценарий bash, который мне нравится использовать в Linux. Он имеет четыре режима, компилирует, компилирует и запускает, компилирует для выпуска с оптимизацией и компилируется для выпуска с оптимизацией, а затем запускает игру.

Сохранить это как build.sh, а затем с помощью Linux терминал типа «CHMOD + х build.sh»

#######!/bin/bash 

appRunning=1 

while [ $appRunning == 1 ]; do 
    echo Compile debug[1], Compile and run debug[2], Compile release[3], Compile and run release[4], Exit[5] 
    read user 

    if [[ $user == 1 ]]; then 
     clear 
     echo Compiling for debug... 
     echo 
     g++ -c src/*.cpp -std=c++14 -Werror -m64 
     g++ *.o -o bin/debug/Game -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network 
     read -n 1 -s 
     clear 

    elif [[ $user == 2 ]]; then 
     clear 
     echo Compiling and running for debug... 
     echo 
     g++ -c src/*.cpp -std=c++14 -Werror -m64 
     g++ *.o -o bin/debug/Game -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network 
     ./bin/debug/Game 
     read -n 1 -s 
     clear 

    elif [[ $user == 3 ]]; then 
     clear 
     echo Compiling for release... 
     echo 
     g++ -c src/*.cpp -std=c++14 -m64 -O3 -fexpensive-optimizations -s 
     g++ *.o -o bin/release/Game -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network 
     read -n 1 -s 
     clear 

    elif [[ $user == 4 ]]; then 
     clear 
     echo Compiling and running for release... 
     echo 
     g++ -c src/*.cpp -std=c++14 -m64 -O3 -fexpensive-optimizations -s 
     g++ *.o -o bin/release/Game -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network 
     ./bin/release/Game 
     read -n 1 -s 
     clear 
    elif [[ $user == 5 ]]; then 
     exit 
    fi 
done 

Он собирает все .cpp файлы, расположенные в папке «ЦСИ» и выходы в бункер/Игра. Конечно, вы можете изменить это по своему усмотрению.

Смежные вопросы