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).
[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
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. –