Ошибка сегментации в программе, скомпилированной icpc

У меня возникают проблемы с пониманием ошибки сегментации, которую я получаю при попытке запуска программ, скомпилированных icpc.

Простой пример состоит из следующих файлов:

// Filename: include/lib1.h
#include <string>

namespace Lib1 {
  // Template initialization, T: int, double
  template< typename T>
    T function1( T x, T y );

  // Give me the version
  std::string VERSION(void);
}
// Filename: include/lib2.h
#include <string>

namespace Lib2 {
  // Give me the version
  std::string VERSION(void);
}
// Filename: src/main.cpp
#include <iostream>
#include <string>

#include "lib1.h"
#include "lib2.h"

int main( int argc, char* argv[] ) {
  std::cout << "Lib1::VERSION() :" << Lib1::VERSION()
            << std::endl;
  std::cout << "Lib2::VERSION() :" << Lib2::VERSION()
            << std::endl;

  double x = 1., y = 2.;

  std::cout << "Lib1::function1(x, y): "
            << Lib1::function1(x, y)
            << std::endl;

  return 0;
}
// Filename: src/lib1/lib1.cpp
#include <string>

#include "lib1.h"

template< typename T >
T Lib1::function1( T x, T y ) {
  return x * y;
}

std::string Lib1::VERSION(void) {
  return std::string("v0.0.2");
}

// Instantiation for dynamic library
template double Lib1::function1(double, double);
template int Lib1::function1(int, int);
// Filename: src/lib2/lib2.cpp
#include <string>

#include "lib2.h"

std::string Lib2::VERSION(void) {
  return std::string("v0.0.1");
}

В этом простом глупом примере, когда я компилирую файлы, используя

clang++ -Wall -c -fPIC -I include -o liblib1.o src/lib1/lib1.cpp
clang++ -Wall -shared -o liblib1.so liblib1.o
clang++ -Wall -c -fPIC -I include -o liblib2.o src/lib2/lib2.cpp
clang++ -Wall -shared -o liblib2.so liblib2.o
clang++ -Wall -o main.out -I include -L ./ -llib1 -llib2 src/main.cpp

программа работает нормально (при условии, что я правильно изменил свою переменную среды LD_LIBRARY_PATH. Однако, когда я использую

icpc -Wall -c -fPIC -I include -o liblib1.o src/lib1/lib1.cpp
icpc -Wall -shared -o liblib1.so liblib1.o
icpc -Wall -c -fPIC -I include -o liblib2.o src/lib2/lib2.cpp
icpc -Wall -shared -o liblib2.so liblib2.o
icpc -Wall -o main.out -I include -L ./ -llib1 -llib2 src/main.cpp

то программа выдает мне:

[1]    27397 segmentation fault (core dumped) LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./main.out

Я был бы признателен, если бы вы помогли мне понять и решить эту проблему. Когда я провел некоторое исследование в Интернете, я наткнулся на некоторые источники, в которых говорилось о проблемах с доступом к памяти и тому подобном, но сейчас я не делаю ничего необычного. Более того, я пытался использовать ddd (я плохо разбираюсь в gdb) и запускал программу там, но программа существует с segfault сразу после запуска программы. Я даже не могу отследить программу (да, до запуска ddd я использовал -debug -g переключатели).


person Arda Aytekin    schedule 18.07.2016    source источник
comment
[FWIW] шаблоны должны быть определены в файле заголовка   -  person NathanOliver    schedule 18.07.2016
comment
Прошу прощения, @NathanOliver, но я не мог понять проблему. В предоставленной ссылке решение в точности такое же, как и в приведенных выше примерах.   -  person Arda Aytekin    schedule 18.07.2016


Ответы (1)


Так случилось, что Intel Parallel Studio v16.0.3 имеет (известные) проблемы для Ubuntu и Arch Linux, и, к сожалению, эти системы также официально не поддерживаются.

Одним из быстрых обходных путей является переход на v16.0.2 на данный момент.

person Arda Aytekin    schedule 19.07.2016