2016-12-13 70 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 

这就是你所需要的,如果你不想写自己的规则。