2016-05-09 77 views
6

我想讓英特爾C++編譯器使用與編譯器的默認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 

(她e它根本不使用任何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; 
} 

編輯:

只是可以肯定有這個正確的動機。此係統上的默認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

我懷疑這是一個富有成效的練習。如果標準庫可以在編譯器之外使用,那麼我有些害怕,現在有太多的編譯器是內在的。但是你需要什麼類型的特質? – SergeyA

回答

-1

編譯器及其標準庫的綁定非常緊密。我懷疑你會得到這個任務的任何地方。

使用不同的編譯器/標準庫或捅英特爾來修復它們的實現,然後升級。

+7

英特爾編譯器是一個例外。它們被設計爲與Linux上的GCC工具鏈(以及Windows上的MS工具鏈)兼容,包括stdC++。 – kkm

+0

...和Mac上的LLVM編譯器工具鏈。 – Jeff

4

找到了!

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

英特爾編譯器希望可執行文件bin/gcc出現在該路徑中,並使用此可執行文件查詢C++頭文件的位置。

+0

從手冊頁中找到這些信息真的不是直接的。所以在SO – ritter

+0

上有這個很不錯,不幸的是,這個選項在Intel 17('icpc:command line warning#10006:忽略未知選項'-cxxlib =/usr/local/Cellar/llvm/4.0.0')中已經被棄用了。 ,或者至少這是我在Mac上看到的。 – Jeff

相關問題