2
getcwd( buff, 1024); 

現在の次の作業パスを示します。私は何をすべきか?

buff = "/home/online0227/my project/Tutorial/Tutorial 1 Device Seletion\0"

Linux で次の関数を使用してファイルをロードしようとしてい.soますが、すべて失敗します。.so私のファイルへのパスを記述する正しいパスは何ですか?

   m_hSO = ::dlopen("..//..//..//..//..//so//myso.so", RTLD_LAZY);
   if(!m_hSO) {
   m_hSO = ::dlopen("..//..//..//..//..//so/myso.so", RTLD_LAZY);
   }
   if(!m_hSO) {
   m_hSO = ::dlopen("../../../../../so/myso.so", RTLD_LAZY);
   }
   if(!m_hSO) {
   m_hSO = ::dlopen("..//..//so/myso.so", RTLD_LAZY);
   }
4

1 に答える 1

3
  1. 「//」ではなく「/」のパス区切り記号を使用することを検討してください。「//」を使用しても悪影響が生じるとは思いませんが、「/」で十分です。

  2. LD_LIBRARY_PATH を設定し、共有ライブラリの場所を含めます。dlopen()これは、 (または::dlopen()) ライブラリを確実に見つけるための最良の方法です。「相対パス」は現在の作業ディレクトリに対して相対的であり、プログラムが起動されたときの現在の作業ディレクトリと、::dlopen()呼び出される時点までのコードによる現在の作業ディレクトリへの変更に実際に依存することに注意してください。

  3. あなたのプログラムが .so を見つけられない理由については、呼び出したときに呼び出し::dlopen()て、その内容を確認する必要がgetcwd()あります。これは、相対パスを調整するのに役立ちます。ただし、非常に正当な理由がない限り、これは悪い習慣であることを繰り返します。

于 2013-08-26T15:24:21.543 に答える