2017-09-29 7 views
2

私のプログラムには奇妙なメモリ関連のエラーがあります。Valgrind:実行可能なプログラムの共有ライブラリをロードできませんでした

これはintel mklを使用するため、いくつかのmkl固有の共有ライブラリに依存します。

私のプログラムを実行すると、ほとんどの作業が完了した後にセグメンテーションが行われます。 segfaultは、関数呼び出しfclose()でnullでないファイルポインタに発生します。

プログラムをgdbで実行すると、スタックトレースはあまり役に立ちません。

私はvalgrindを実行して、自分のコードで考えられるエラーを見つけたいと思っていました。

しかし、私はvalgrindから実行可能ファイルを実行できません。次のエラーメッセージが表示されます。

==52778== Memcheck, a memory error detector 
==52778== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
==52778== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info 
==52778== Command: ./main.exe 
==52778== 
./main.exe: error while loading shared libraries: libmkl_intel_lp64.so: cannot open shared object file: No such file or directory 

同じディレクトリに存在しているlibmkl_intel_lp64.so共有ライブラリ(だけでなく、私の実行ファイルが依存する他のすべての共有ライブラリ)。

私のコードを評価するためにこの問題を解決するにはどうすればよいですか?

ありがとうございました。

編集:私も環境変数LD_LIBRARY_PATHを現在のディレクトリに設定しましたが、それは助けになりませんでした。

編集:、Linuxの64ビット上で実行している使用してインテル®コンパイラー2017

+0

どのプラットフォームを実行していますか? '。/ main.exe'は、powershellの中からウィンドウを走っていることを示しています(Linux上の' gcc'コンパイル文字列に何らかの理由で '-o main.exe'を追加しない限り)。あなたが窓にいるなら、MinGW、MinGW-TDMを使っていますか? 'LD_LIBRARY_PATH'を設定したときに、ウィンドウやPOSIXパスの表記法を使用しましたか(例えば' c:/ path/to/your/lib')? –

+0

Linuxで動作します。インテルコンパイラの使用。 –

+2

これは役に立ちます - '.exe'は本当に私を守りません。 'libmkl_intel_lp64.so'を持つ' -Wl、-rpath =/path/to/dir'を追加して 'main.exe'を再コンパイルして、やり直してください。 –

答えて

1

共有ライブラリのlibmkl_intel_lp64.soが同じ ディレクトリに存在する(だけでなく、私の実行可能 が依存する他のすべての共有ライブラリ)であります。

私のコードを評価するためにこの問題を解決するにはどうすればよいですか?

valgrindは、その仕事を行うために、さまざまな機能のための独自の環境とラッパーを提供します。 LD_LIBRARY_PATHを設定しているにも関わらず、ライブラリの検索で問題が発生している場合は、ライブラリが含まれているリンカーオプション-rpath=/path/to/dirを使用してライブラリ検索パスを実行ファイル自体に指定することもできます。コンパイル文字列のほかには、次のようになります。そして、

-Wl,-rpath=/path/to/dir /* that has libmkl_intel_lp64.so in it */ 

ライブラリは、外部環境やvalgindは、現在の作業ディレクトリにそのライブラリの検索を延長するという希望に依存しない見つけます。

(うまくいきました)

+0

その悲しい2017年のLinuxパスは依然としてf ** k'dです。パスを修正しようとする彼らの最新のガジェットは、いくつかのDTビットを追加します。これで '-Wl、 - enable-new-dtags'を使う必要があります。 – jww

関連する問題