Использование различных заголовков библиотеки Standard C++ с компилятором Intel

Я пытаюсь, чтобы компилятор Intel 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

(здесь он вообще не использует заголовки 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
                  ^

person ritter    schedule 09.05.2016    source источник
comment
Сомневаюсь, что это плодотворное упражнение. Я боюсь, что дни, когда стандартную библиотеку можно было использовать вне ее компилятора, прошли - в настоящее время там слишком много встроенных компиляторов. Но какая черта типа вам нужна?   -  person SergeyA    schedule 09.05.2016


Ответы (2)


Нашел!

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

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

person ritter    schedule 09.05.2016
comment
На самом деле не так просто найти эту информацию на странице руководства. Так что хорошо иметь это на SO - person ritter; 09.05.2016
comment
К сожалению, эта опция устарела в Intel 17 (icpc: command line warning #10006: ignoring unknown option '-cxxlib=/usr/local/Cellar/llvm/4.0.0'), по крайней мере, это то, что я вижу на Mac. - person Jeff Hammond; 06.04.2017

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

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

person Jesper Juhl    schedule 09.05.2016
comment
Компиляторы Intel являются исключением. Они предназначены для совместимости с набором инструментов GCC в Linux (и набором инструментов MS в Windows), включая stdc++. - person kkm; 09.05.2016
comment
...и набор инструментов компилятора LLVM для Mac. - person Jeff Hammond; 06.04.2017