您有以下示例代码:
func.h - 函数的头文件
#include <vector>
#include <tuple>
using std::vector;
using std::tuple;
tuple <double,double> A(vector<int>& n);
func.cpp - 功能cpp文件
#include <iostream>
#include <vector>
#include <tuple>
using namespace std;
tuple <double,double> A(vector<int>& n)
{
double a1=n.size();
double a2=a1+0.5;
return make_tuple(a1,a2);
}
main.cpp - 主cpp文件
#include <iostream>
#include <vector>
#include <tuple>
#include "func.h"
using namespace std;
int main()
{
double a1,a2;
vector<int> n;
n.push_back(1);
n.push_back(2);
tie(a1,a2)=A(n);
return 0;
}
这在视觉工作室很好地编译。
我在Linux(gcc版本4.4.7 20120313 Red Hat 4.4.7-11)上编译时遇到问题:
g++ -03 -std=c++0x main.cpp func.cpp -lm
它没有编译,我收到以下错误:
1. In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/array:35,from main.cpp:5:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/c++0x_warning.h:31:2: error: #error This file requires compiler and library suppcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
2. ‘std::tuple’ has not been declared
3. expected constructor, destructor, or type conversion before ‘<’ token
任何有关如何处理此问题的指导都会有所帮助!
答案 0 :(得分:3)
令人惊讶的是,错误似乎告诉你std = c ++ 0x没有设置。 仔细检查您的编译命令。它应该是
g++ -std=c++0x -o b main.cpp func.cpp -O3 -lm
而不是
g++ -o -std=c++0x b main.cpp func.cpp -03 -lm
与最初的问题一样。
答案 1 :(得分:2)
我剪切并粘贴了您的三个文件(func.h
,func.cpp
和main.cpp
),我可以向您保证,在我的Linux机箱(CentOS 7.2)上使用g ++(GCC)4.8。 5 20150623(Red Hat 4.8.5-4)一切正常(你的原始命令有一些错误):
g++ -o myProg -O3 -std=c++0x main.cpp func.cpp -lm
更新您的GCC(如果您有几个小时,甚至可以从来源获得;))。
答案 2 :(得分:2)
您告诉GCC输出名为“-std = c ++ 0x”的文件,因此根本不设置该选项,从而导致此错误。之后用“b”做什么,我不知道。但是你应该总是执行“-o outputfilename”而不是在“-o”选项和它的参数之间放置其他选项。
答案 3 :(得分:-1)
由于您希望在具有旧版本Linux和C++11的服务器上运行可执行文件(从最近的C++14或GCC源代码编译) - 您有{{3它不支持最近的C ++标准,因为它出现在2009年C ++ 11发布日期(2011年)之前 - 您可以尝试以下方法:
在您自己的笔记本电脑(或计算机)上安装最新的Linux发行版并运行{{检查其GCC 4.4编译器至少GCC(最好是GCC 5) 1}}(您可能需要使用g++ --version
代替g++-5
等...)
使用g++
在该笔记本电脑上静态编译和链接 您的程序(如果您想优化和/或g++ -static -std=c++14 -Wall func.cpp main.cpp -lm -o mybinprog
,也可以-O3
for debugging -better在本地进行调试 - )
将可执行文件复制(例如使用-g
)到远程服务器并在那里运行
很可能(但不确定)在较新的Linux(笔记本电脑)上构建的静态链接可执行文件将在某些较旧的Linux服务器上运行。
顺便说一下,要编译多源文件程序,最好学习如何使用GCC 6
请注意,scp mybinprog remotehost:
的程序参数顺序非常重要,请阅读有关GNU make
的文档。
PS。从技术上讲,您甚至可以尝试动态链接C库和静态链接C ++标准库。