2016-08-23 6 views
2

Привет имеют следующий пример кода:Компиляция на Linux с C++ стандартной библиотеки

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

gcc версия 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) – jarhead

+3

Версия 4.4 GCC не поддерживает C++ 11 очень хорошо, практически ничего из этого не происходит. Если возможно, вам следует обновить GCC до более поздней версии (теперь это до версии 6.2, которая полностью поддерживает C++ 11 и C++ 14 и большую часть предстоящего C++ 17). –

+0

Я не могу его обновить, это внешний сервер, и ответственный парень этого не сделает ... другими способами? ICPC? что-нибудь еще? – jarhead

ответ

2

вырезать и вставить свои три файла (func.h, func.cpp и main.cpp), и я могу заверить вас, что на моем Linux поле (CentOS 7.2) с г ++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4) все работает отлично (оригинал команды были некоторые ошибки):

g++ -o myProg -O3 -std=c++0x main.cpp func.cpp -lm

Обновите GCC (даже из других источников, если у вас есть несколько часов;)).

-1

Так как вы хотите, чтобы запустить исполняемый файл (составитель из недавних C++11 или C++14 исходного кода) на сервере со старой версией Linux и GCC -вы имеют GCC 4.4, который не поддерживает последние стандарты C++, так как он появился в 2009 году до даты публикации (2011 г.) C++ 11- вы можете попробовать следующее:

  • установки последнего дистрибутива Linux на свой ноутбук (или компьютер) и убедитесь, что его GCC компилятор по крайней мере GCC 5 (и предпочтительно GCC 6), запустив g++ --version (возможно, вам потребуется использовать g++-5 вместо g++ и т.д ...)

  • компилировать и компоновать статически программа на этом ноутбуке с помощью g++ -static -std=c++14 -Wall func.cpp main.cpp -lm -o mybinprog (и, возможно, также -O3, если вы хотите оптимизировать и/или -g для отладки -Лучша сделать отладку локально -)

  • копия (напр. с помощью scp mybinprog remotehost:) исполняемого файла на удаленный сервер и запустить его там

Весьма вероятно (но не уверен), что статически скомпонованный исполняемый файл, построенный на новой Linux (ноутбук) будет работать на некоторых старых сервере Linux.

Кстати, для компиляции программы файл с нескольких источников, лучше узнать, как использовать GNU make

Обратите внимание, что порядок аргументов программы для g++ имеет значение большой много, поэтому читайте документацию о Invoking GCC.

PS. Технически вы можете даже попытаться динамически связать библиотеку C и статически стандартную библиотеку C++.

+0

Почему downvote? –

+0

OP показывает ошибку компоновщика, вы объясните ошибки времени выполнения, которые могут даже не иметь отношения к ситуации OP (хотя я согласен, что рекомендации хороши, но не достойны ответа). – rubenvb

+0

OP делает * не * показывает ошибку компоновщика, но ошибку о стандарте языка. –

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 

как в оригинальном вопросе.

2

Вы сообщаете GCC о выходе в файл с именем «-std = C++ 0x» и, таким образом, не устанавливаете эту опцию вообще, что приводит к этой ошибке. Что он делает с «b» потом, я понятия не имею. Но вы всегда должны делать «-o outputfilename» и не устанавливать другие опции между опцией «-o» и ее аргументом.

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