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
スイッチを使用しました)。
[FWIW] [テンプレートはヘッダーファイルで定義する必要があります](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – NathanOliver
申し訳ありません@ NathanOliver、しかし、私は問題を理解できませんでした。提供されたリンクでは、上記の例を提供したときの解決策とまったく同じです。 –