2016-07-18 3 views
0

У меня возникают проблемы с пониманием ошибки сегментации, которую я получаю при попытке запуска программ, скомпилированных 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 

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

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 переключатели).

+0

[FWIW] [шаблоны должны быть определены в файле заголовка] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – NathanOliver

+0

Извините, @NathanOliver, но я не мог понять проблему. В приведенной ссылке решение * точно * совпадает с тем, что я сделал при предоставлении приведенных выше примеров. –

ответ

0

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

Быстрое обходное решение похоже на понижение до v16.0.2 пока.