icc & export
От: Аноним  
Дата: 14.08.05 00:36
Оценка:
Что-то я не пойму. В документации по icc 9.0 for linux есть опция -export, которая должна включать поддержку экспорта шаблонов. Но как начнёшь её использовать, компилятор ест, а линкер ругается. Причём странно, все нужные .et файлы генерируются, а на стадии линковки я всё равно получаю undefined reference. Может кто знает в чём проблема? Вот тест, который я пытаюсь скомпилировать:

// test3.h
#if !defined(test3_h_98273492)
#define test3_h_98273492

export template <typename T>
T foo(T x);

#endif // test3_h_98273492


// test3.cpp
#include "test3.h"

template <typename T>
T foo(T x)
{
    return g(x * x + x);
}


// test3main.cpp
#include <cmath>
#include <iostream>
#include "test3.h"

using namespace std;

double g(double x)
{
    return sqrt(x);
}

int main()
{
    double x = 5.5;
    cout << foo(x) << endl;
}


# compile
$ icpc -export test3.cpp test3main.cpp -o test3
/tmp/icpcGrZ2LE.o(.text+0x1e): In function `main':
: undefined reference to `double foo<double>(double)'
Re: icc & export
От: Daevaorn Россия  
Дата: 14.08.05 14:47
Оценка:
А>// test3.cpp
А>#include "test3.h"

Убери #include из этого файла
Re[2]: icc & export
От: Аноним  
Дата: 14.08.05 20:41
Оценка:
Здравствуйте, Daevaorn, Вы писали:

А>>// test3.cpp

А>>#include "test3.h"

D>Убери #include из этого файла


Не помогло. А, собственно, почему ты думал, что это исправит ситуацию?
Re: icc & export
От: dad  
Дата: 15.08.05 04:57
Оценка:
А>
А># compile
А>$ icpc -export test3.cpp test3main.cpp -o test3
А>/tmp/icpcGrZ2LE.o(.text+0x1e): In function `main':
А>: undefined reference to `double foo<double>(double)'
А>


похоже на то что в main он думает на твой шаблон как на импортируемый.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re: icc & export
От: Lorenzo_LAMAS  
Дата: 15.08.05 06:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что-то я не пойму. В документации по icc 9.0 for linux есть опция -export, которая должна включать поддержку экспорта шаблонов. Но как начнёшь её использовать, компилятор ест, а линкер ругается. Причём странно, все нужные .et файлы генерируются, а на стадии линковки я всё равно получаю undefined reference. Может кто знает в чём проблема? Вот тест, который я пытаюсь скомпилировать:


Да, экспорт есть. Он появился еще в версии 8.1 для линукса. Вот пример из документации (насколько я понимаю, у комо в отношении экспорта все намного удобнее)

http://www.intel.com/software/products/compilers/clin/docs/ug_cpp/lin1160.htm

// file1.cpp

#include <stdio.h>

static void trace() { printf("File 1\n"); }

export template<class T> T const& min(T const&, T const&);

int main() {

  trace();

  return min(2, 3);

}

 

// file2.cpp

#include <stdio.h>

static void trace() { printf("File 2\n"); }

export template<class T> T const& min(T const &a, T const &b) {

  trace();

  return a<b? a: b;

}

Как компилировать:

prompt>icpc -export -export_dir /usr2/export/ -c file1.cpp

prompt>icpc -export -export_dir /usr2/export/ -c file2.cpp

prompt>icpc -export -export_dir /usr2/export/ file1.o file2.o

Of course, the code must be complete enough to compile and link.
Re[2]: icc & export
От: Аноним  
Дата: 15.08.05 08:50
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Здравствуйте, Аноним, Вы писали:


А>>Что-то я не пойму. В документации по icc 9.0 for linux есть опция -export, которая должна включать поддержку экспорта шаблонов. Но как начнёшь её использовать, компилятор ест, а линкер ругается. Причём странно, все нужные .et файлы генерируются, а на стадии линковки я всё равно получаю undefined reference. Может кто знает в чём проблема? Вот тест, который я пытаюсь скомпилировать:


L_L>Да, экспорт есть. Он появился еще в версии 8.1 для линукса. Вот пример из документации (насколько я понимаю, у комо в отношении экспорта все намного удобнее)


L_L>http://www.intel.com/software/products/compilers/clin/docs/ug_cpp/lin1160.htm


...

Спасибо за перевод документации. I really appreciate it .

Методом научного тыка мне удалось выяснить, что включение <cmath> или <iostream> вызывает в последствии ошибку undefined reference для экспортируемого шаблона. Вероятно, в компиляторе переполняется какая-то таблица функций. Вот такие пироги с поддержкой export в Intel C++.

Для справки: Comeau прекрасно собрал мне бинарник.

PS:
Comeau — всего за $20 до 1 сентября.
Re[3]: icc & export
От: Lorenzo_LAMAS  
Дата: 15.08.05 08:53
Оценка:
А>Спасибо за перевод документации. I really appreciate it .

Я им не занимался. Я привел пример командных строк, с помощью которых можно скомпилировать пример.
Of course, the code must be complete enough to compile and link.
Re: icc & export
От: Абыр Абырвалг Россия  
Дата: 15.08.05 10:42
Оценка:
Лучше экспортом не пользоваться. Баловство все это. Линкеру и без этого уже плохо...
Re[2]: icc & export
От: ArtDenis Россия  
Дата: 15.08.05 18:15
Оценка:
Здравствуйте, Абыр Абырвалг, Вы писали:

АА>Лучше экспортом не пользоваться. Баловство все это. Линкеру и без этого уже плохо...


Согласен. Вот была бы STL и boost под экспорт заточена...
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: icc & export
От: alexeiz  
Дата: 16.08.05 05:21
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, Абыр Абырвалг, Вы писали:


АА>>Лучше экспортом не пользоваться. Баловство все это. Линкеру и без этого уже плохо...


AD>Согласен. Вот была бы STL и boost под экспорт заточена...


А я вот не согласен. Если имеется компилятор, поддерживающий export, то это ничего так даже приятная штука. И мне как-то всё равно, как себя чувствует линкер.

Кстати, Dinkumware производит STL, в котором используется export.
Re[4]: icc & export
От: Lorenzo_LAMAS  
Дата: 16.08.05 07:59
Оценка:
A>А я вот не согласен. Если имеется компилятор, поддерживающий export, то это ничего так даже приятная штука. И мне как-то всё равно, как себя чувствует линкер.

А тоже так считаю. Но вот беда, у интела все как-то очень коряво. Может руки как нить не так растут, но добиться работы экспорта при наличии <iostream> я не смог.

A>Кстати, Dinkumware производит STL, в котором используется export.
Of course, the code must be complete enough to compile and link.
Re[4]: icc & export
От: ArtDenis Россия  
Дата: 16.08.05 09:25
Оценка:
Здравствуйте, alexeiz, Вы писали:

AD>>Согласен. Вот была бы STL и boost под экспорт заточена...

A>А я вот не согласен. Если имеется компилятор, поддерживающий export, то это ничего так даже приятная штука. И мне как-то всё равно, как себя чувствует линкер.

Я имел ввиду, что мои собственные шаблонные библиотеки занимают не особо большой объём и бысто компилируются. Поэтому я не вижу особой необходимости в том, чтобы использовать экспорт в своих библиотеках. Зато STL и буст компилируются очень медленно из-за большого объёма кода. Я был бы не против, если эти быблиотеки были бы заточен под экспорт. Думаю, время компиляции файлов увеличилось бы на несколько порядков.
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[5]: icc & export
От: alexeiz  
Дата: 16.08.05 09:30
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

A>>А я вот не согласен. Если имеется компилятор, поддерживающий export, то это ничего так даже приятная штука. И мне как-то всё равно, как себя чувствует линкер.


L_L>А тоже так считаю. Но вот беда, у интела все как-то очень коряво. Может руки как нить не так растут, но добиться работы экспорта при наличии <iostream> я не смог.


Вероятно EDG frontend старый. Intel что-то не спешит его обновлять. Остается como. Я с ним сейчас и развлекаюсь.

Собственно говоря, после прочтения вот этой дискуссии я и заинтересовался export'ом. А до этого, следуя Herb Sutter'у, считал, что это — бесполезная вещь. Теперь придерживаюсь мнения, что сначала нужно попробовать, а потом уже решать.

A>>Кстати, Dinkumware производит STL, в котором используется export.
Re[6]: icc & export
От: Lorenzo_LAMAS  
Дата: 16.08.05 09:36
Оценка:
A>Собственно говоря, после прочтения вот этой дискуссии я и заинтересовался export'ом. А до этого, следуя Herb Sutter'у, считал, что это — бесполезная вещь. Теперь придерживаюсь мнения, что сначала нужно попробовать, а потом уже решать.

Экспорт вещь интересная. Мне вот понравилось, что благодаря ему компилятор наконец-то может найти нетривиальные ошибки (хотя это, конечно, мелкий побочный эффект). А людям типа Саттера, ИМХО, не стоит доверять безоговорочно. Об экспорте надо читать мнение людей, его реализовавших, уж кому-кому а им виднее, что такое экспорт.
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.