2016-05-09 3 views
6

Я пытаюсь использовать компилятор Intel C++ для разных стандартных библиотек C++, чем стандартные по умолчанию компиляторы. Заголовки, которые компилятор будет использовать по умолчанию, к сожалению, не определяют специфический тип/функцию, которые мне нужны.Использование разных стандартных библиотек библиотеки C++ с компилятором Intel

$ icpc --version 
icpc (ICC) 16.0.2 20160204 
Copyright (C) 1985-2016 Intel Corporation. All rights reserved. 

Заголовки Я хотел бы использовать расположены в

ls /opt/crtdc/gcc/4.8.5-4/include/c++/4.8.5/: 

algorithm cfenv  condition_variable cstring ext    iostream numeric   sstream  tuple 
array  cfloat  csetjmp    ctgmath fenv.h   istream ostream   stack   typeindex 
atomic  chrono  csignal    ctime  forward_list  iterator parallel   stdexcept  typeinfo 
backward cinttypes cstdalign   cwchar  fstream   limits profile   streambuf  type_traits 
bits  ciso646 cstdarg    cwctype functional  list  queue    string  unordered_map 
bitset  climits cstdbool   cxxabi.h future   locale random   system_error unordered_set 
cassert clocale cstddef    debug  initializer_list map  ratio    tgmath.h  utility 
ccomplex cmath  cstdint    decimal iomanip   memory regex    thread  valarray 
cctype  complex cstdio    deque  ios    mutex  scoped_allocator tr1   vector 
cerrno  complex.h cstdlib    exception iosfwd   new  set    tr2   x86_64-redhat-linux 

Но что бы я ни стараюсь, я либо получить

icpc -std=c++11 -o test test.cc -Qlocation,cxxinc,/opt/crtdc/gcc/4.8.5-4/include/c++/4.8.5/ 

error: namespace "std" has no member "declval" 

(здесь я думаю, что компилятор использует это заголовок по умолчанию местоположение) или

icpc -std=c++11 -o test test.cc -nostdinc++ -Qlocation,cxxinc,/opt/crtdc/gcc/4.8.5-4/include/c++/4.8.5/ 

test.cc(2): catastrophic error: cannot open source file "utility" 
    #include <utility>  // std::declval 

(здесь он вообще не использует заголовки C++, потому что флаг -nostdinC++ отключает все это вместе, я думаю)

Программа test.cc просто использует стандартную библиотечную функцию C++ 11, которая мне понадобится:

// declval example 
#include <utility>  // std::declval 
#include <iostream>  // std::cout 

struct A {    // abstract class 
    virtual int value() = 0; 
}; 

class B : public A { // class with specific constructor 
    int val_; 
public: 
    B(int i,int j):val_(i*j){ 
    std::cout << "ctor\n"; 
    } 
    int value() {return val_;} 
}; 

int main() { 
    decltype(std::declval<A>().value()) a; // int a 
    decltype(std::declval<B>().value()) b; // int b 
    decltype(B(0,0).value()) c; // same as above (known constructor) 
    a = b = B(10,2).value(); 
    std::cout << a << '\n'; 
    return 0; 
} 

EDIT:

Просто убедитесь, что это правильно мотивированы. Заголовки C++ 11 по умолчанию в этой системе не поддерживают std :: declval. Вот почему я пытаюсь использовать GCC, которые его поддерживают.

$ icpc -std=c++11 -o test test.cc 
opa.cc(19): error: namespace "std" has no member "declval" 
    decltype(std::declval<A>().value()) a; // int a 
       ^
+3

Я сомневаюсь, что это плодотворное упражнение. Я в afaraid дней, когда стандартная библиотека может быть использована за пределами ее компилятора, исчезло - в настоящее время слишком много компиляторов. Но какой тип черты вам нужен? – SergeyA

ответ

-1

Компиляторы и их стандартные библиотеки довольно тесно связаны. Я сомневаюсь, что вы все равно с этим закончите.

Используйте другой компилятор/std lib или попросите Intel исправить их реализацию, а затем обновить.

+7

Компиляторы Intel являются исключением. Они предназначены для совместимости с GCC toolchain на Linux (и MS toolchain на Windows), включая stdC++. – kkm

+0

... и LLVM компилятор toolchain на Mac. – Jeff

4

Нашли это!

icpc -std=c++11 -o tes test.cc -cxxlib=/opt/crtdc/gcc/4.8.5-4/ 

Процессор Intel компилятор ожидает, что исполняемый бен/куб.см до присутствовать в этом пути и запрашивает местоположение для заголовков C++ с помощью этого исполняемого файла.

+0

Это действительно не так, чтобы найти эту информацию на странице руководства. Так что хорошо иметь это на SO – ritter

+0

К сожалению, этот параметр устарел в Intel 17 ('icpc: предупреждение командной строки # 10006: игнорирование неизвестной опции '-cxxlib =/usr/local/Cellar/llvm/4.0.0'') , или, по крайней мере, это то, что я вижу на Mac. – Jeff