2016-07-18 24 views
0

Ich habe Probleme, den Segmentierungsfehler zu verstehen, den ich erhalte, wenn ich versuche, icpc-kompilierte Programme auszuführen.Segmentierungsfehler bei icpc-kompiliertem Programm

Ein einfaches Beispiel besteht aus den folgenden Dateien:

// 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"); 
} 

In diesem einfachen, dumm Beispiel, wenn kompilieren ich die Dateien mit

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 

Das Programm läuft gut (vorausgesetzt, ich ändere meine LD_LIBRARY_PATH Umgebungsvariable richtig. Allerdings, wenn ich verwende

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 

dann das Programm gibt mir:

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

würde ich mich freuen, wenn Sie mir geholfen, zu verstehen und dieses Problem zu lösen. Als ich im Internet recherchiert habe, bin ich auf einige Quellen gestoßen, die über Speicherzugriffsprobleme und ähnliches sprachen, aber momentan mache ich nichts Besonderes. Außerdem habe ich versucht, ddd (ich bin nicht fließend/gut in gdb) und das Programm dort ausführen, aber das Programm existiert mit dem segfault unmittelbar nach dem Programmstart. Ich kann nicht einmal das Programm verfolgen (ja, vor dem Ausführen ddd, habe ich -debug -g Schalter verwendet).

+0

[FWIW] [Vorlagen müssen in der Header-Datei definiert werden] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implementiert-in-the-header-file) – NathanOliver

+0

Es tut mir leid @NathanOliver, aber ich konnte das Problem nicht verstehen. In dem angegebenen Link ist die Lösung genau so, wie ich es bei der Bereitstellung der obigen Beispiele getan habe. –

Antwort

0

Es geschah der Fall, dass Intel Parallel Studio v16.0.3 hat (bekannt) Ausgaben für Ubuntu und Arch Linux Plattformen und leider ist diese Systeme nicht offiziell unterstützt, entweder zu sein.

Ein schneller Workaround scheint zu sein, auf v16.0.2 für jetzt downgrade.