2016-05-09 16 views
6

インテル®C++コンパイラーに、コンパイラーのデフォルトのものとは異なる標準ライブラリーC++ヘッダーを使用させようとしています。コンパイラがデフォルトで使用するヘッダーは残念ながら、私が必要とする特定の型の特性/関数を定義していません。私が使用したいインテル®コンパイラーで別の標準C++ライブラリー・ヘッダーを使用する

$ 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 

(彼女-nostdinC++フラグはすべて一緒に無効にするので、C++ヘッダーはまったく使用しません)

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をサポートしようとしています。

+3

私はそれが実り多い運動であるとは思わない。私は、標準のライブラリがコンパイラの外で使用できるようになった日は近づいています - 現在、そこには非常に多くのコンパイラがあります。しかし、どのようなタイプの形質が必要ですか? – SergeyA

答えて

-1

コンパイラとその標準ライブラリはかなり緊密に結びついています。私はあなたがこの努力でどこにでも行くことを疑う。

インテルを別のコンパイラ/標準ライブラリまたはインテルを使用して実装を修正し、アップグレードしてください。

+7

インテルコンパイラは例外です。これらは、stdC++を含むLinux(およびWindowsのMSツールチェーン)上のGCCツールチェーンと互換性があるように設計されています。 – kkm

+0

...およびMacのLLVMコンパイラツールチェーン。 – Jeff

4

見つけました!

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

Intelコンパイラは、この実行可能ファイルを使用して実行可能bin/gccがそのパスに存在し、C++ヘッダーの場所を照会することを期待しています。

+0

この情報は、マニュアルページから見つけるのは簡単ではありません。これはSO – ritter

+0

にあるのが良いことです。悲しいことに、このオプションはIntel 17で廃止されました( 'icpc:コマンドライン警告#10006:未知のオプションを無視する '-cxxlib =/usr/local/Cellar/llvm/4.0.0'')少なくとも、これは私がMacで見るものです。 – Jeff

関連する問題