LD_LIBRARY_PATH環境変数は、ターゲットC#実行可能ファイルのランタイム環境では認識されません。

LD_LIBRARY_PATH環境変数は、ターゲットC#実行可能ファイルのランタイム環境では認識されません。

私は昨日、Ubuntu Linux 16.04でこのC ++プログラムをテストしました。私を悩ませるのは、次のプログラムがプログラムで単一のサービスを開始することです。 Ubuntu 16.04 /var/log/syslog ファイルで表示できますが、C# 実行可能ファイルのランタイム環境に渡すことはできません。LD_LIBRARY_PATHThe envpポインタが渡されます。execveシステムコール。LD_LIBRARY_PATHターゲット実行可能ファイルのランタイム環境が環境変数を認識しないことがわかる方法は、ターゲット実行可能ファイルが誤動作してランタイムライブラリの依存関係を見つける場所を知らせるすべてのLD_LIBRARY_PATH機能をスキップすることです。

#include <unistd.h>     // execv(), fork()
#include <sys/types.h>  // pid_t
#include <sys/wait.h>   // waitpid()
#include <stdio.h>

int main(int argc, char* argvp)
{
   char *argv[] = { "/usr/lib/mono/4.5/mono-service.exe",
                    "Audio_Video_Recorder.exe", 0};


    char *envp[] =
    {
        "LD_LIBRARY_PATH=.",
        0
    };
    execve(argv[0], &argv[0], envp);
    fprintf(stderr, "Oops!\n");
    return -1;

}

C ++およびLinux APIを使用してプログラムでこれらの監督を変更できますか?

ベストアンサー1

Debian/Ubuntuに基づいているため、問題がrpathに起因する可能性はありません(まだ可能です)。問題に固執する可能性が高くなります

"LD_LIBRARY_PATH=."

絶対パス名を指定しません。

これを使用して、strace実行可能ファイルが開こうとしているパスを表示できます。たとえば、次のようになります。

strace -f -o strace.log mono myprogram

そして「公開」通貨を探してください。

原則として、lddLinux上の任意の共有実行可能ファイルで実行できます。

ldd myprogram

または(おそらく)

ldd /usr/lib/mono/4.5/mono-service.exe

同様に、objdump は次のような有用な情報を提供します。

objdump -ax /usr/lib/mono/4.5/mono-service.exe

絶対パス名で解決される共有ライブラリがあることを確認してください。 obdumpは、出力の「ダイナミックライブラリ」セクションでこれを行う必要があります。

しかしコメントに.NET/Monoアプリケーション用のlddと同じたとえば、環境変数を設定して有用な情報を取得するには、より高いレベル(およびさまざまなツール)が必要になることを示します。

$ MONO_LOG_LEVEL=debug mono myprogram

追加資料:

おすすめ記事