2016-07-18 21 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 

プログラムは正常に動作します(ただし、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スイッチを使用しました)。

+0

[FWIW] [テンプレートはヘッダーファイルで定義する必要があります](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – NathanOliver

+0

申し訳ありません@ NathanOliver、しかし、私は問題を理解できませんでした。提供されたリンクでは、上記の例を提供したときの解決策とまったく同じです。 –

答えて

0

Intelはメーカーv16.0.3UbuntuArch Linuxプラットフォーム用(既知)の問題があり、残念ながらこれらのシステムが正式いずれか、サポートされていないパラレルというケースのように起こりました。

1つの速やかな回避策は、現在はv16.0.2にダウングレードしているようです。

関連する問題