2016-02-29 65 views
2

在編制SFML應用,編譯SFML在Linux(Ubuntu的)

  • 我需要先創建一個與SFML代碼cpp文件並保存文件
  • 然後寫命令: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

Linux上使用Makefile是很常見的。 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

Bad'Makefile';應該使用標準變量('COMPILE.cc','CXXFLAGS');請參閱'make -p'給出的默認規則。而你永遠* *應該調用'G ++'和'-Wall -Wextra'大概也'-g' –

+4

** **錯誤是過於苛刻,這是一個最低工作Makefile文件,解決了這個問題。在這種情況下,我認爲對於之前沒有聽說過Make的人來說更合適,因爲它比* good * Makefile更容易理解。如果OP想要的話,他可以閱讀文檔並學習如何編寫好的Makefiles,但是如果他無需閱讀完整的Make手冊就能掌握基礎知識,他可能更傾向於這樣做。 – Ionut

+0

@BasileStarynkevitch我同意你的看法,我們應該使用標準變量,我也贊同C++的標誌。我用這個。但這不是問題。另外,我只是預覽了其他許多構建自動化工具。這是我鼓勵在互聯網上閱讀一些文件! – Garf365

0

這裏有一個bash腳本我想在Linux上使用。它有四種模式:編譯,編譯和運行,爲優化發佈編譯,並通過優化進行編譯,然後運行遊戲。

保存此作爲build.sh,然後使用Linux終端類型「使用chmod + X 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 

它編譯位於所謂的「SRC」文件夾中的所有cpp文件並輸出到倉/遊戲。當然,你可以修改它以適應你自己的喜好。