2016-12-13 92 views
0

執行C++ 11我有當我執行在終端的Ubuntu條命令「做」的問題。 我的生成文件的代碼是:如何使用makefile文件

all: temp p1 
%: %.cc g++ -lm -lcrypt -O2 -std=c++11 -pipe $< -o [email protected] 

當然,我的文件是temp.cc和p1.cc,但我的問題是在p1.cc,其中的代碼是:

#include <bits/stdc++.h> 
using namespace std; 

int main(){ 
     vector<int> vec = {4,6,8,9,8,7,1,3,4,5,0,1}; 
     for(auto i : vec) 
       cout<<i<<" "; 
     cout<<endl; 

return 0;} 

我使用 '使' 錯誤是:

[email protected]:~/P$ make 
g++  p1.cc -o p1 
p1.cc: In function ‘int main()’: 
p1.cc:7:44: error: in C++98 ‘vec’ must be initialized by constructor, not by ‘{...}’ 
    vector<int> vec = {4,6,8,9,8,7,1,3,4,5,0,1}; 
              ^
p1.cc:7:44: error: could not convert ‘{4, 6, 8, 9, 8, 7, 1, 3, 4, 5, 0, 1}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<int>’ 
p1.cc:9:11: error: ‘i’ does not name a type 
    for(auto i : vec) 
     ^
p1.cc:11:2: error: expected ‘;’ before ‘cout’ 
    cout<<endl; 
^
p1.cc:12:2: error: expected primary-expression before ‘return’ 
    return 0; 
^
p1.cc:12:2: error: expected ‘)’ before ‘return’ 
make: *** [p1] Error 1 

使用下一個命令行,編譯:

g++ --std=c++11 p1.cc -o p1 

和執行是好的:

[email protected]:~/P$ ./p1 
4 6 8 9 8 7 1 3 4 5 0 1 

請幫助我,我不明白爲什麼有問題,感謝您的支持:)

+0

你缺少'G ++'前一個換行符在你的Makefile,通常,您鏈接到圖書館應該來的'G ++'命令的結束。而且,出於某種原因,'g ++'沒有發現你的'-std = C++ 11'標誌或者它不工作。 –

+0

另外,你還沒有'#include'd'vector'。 –

+0

使用「#include 」我得到了所有庫,這是使用g ++編譯器的一個優點,但是感謝您的幫助。 – Rik4chu

回答

1

這是錯誤的:

all: temp p1 
%: %.cc g++ -lm -lcrypt -O2 -std=c++11 -pipe $< -o [email protected] 

您應該添加一個換行符和一個初始選項卡,如下所示:

all: temp p1 
%: %.cc 
     g++ -lm -lcrypt -O2 -std=c++11 -pipe $< -o [email protected] 

(第三行的第一個字符必須爲TAB字符),或者你需要插入這樣一個分號:

all: temp p1 
%: %.cc ; g++ -lm -lcrypt -O2 -std=c++11 -pipe $< -o [email protected] 

什麼是你的makefile在做什麼?首先,沒有任何換行符/製表符或分號的所有行在一行中被認爲是一個單一模式規則,其目標爲%和先決條件%.cc,g++,-lm,-lcrypt等。而且,由於沒有配方,因爲沒有配方的模式規則會刪除模式規則,因此基本上刪除該模式規則(反正不存在)。所以這條線基本上是一個沒有操作並且什麼也不做的。

所以會發生什麼?讓有一堆的內置規則,用於創建的東西,如果你不告訴它怎麼做,而且也知道如何從.cc文件創建一個程序內置的規則,所以要使用該。但是,當然,該內置規則沒有任何自定義設置。

這是簡單的使用make的內置規則和使用標準的make變量來控制它:

CXX := g++ 
CXXFLAGS := -std=c++11 -pipe 
LDLIBS := -lm -lcrypt 

all: temp p1 

這就是你所需要的,如果你不想寫自己的規則。