2

libssh (libssh.org) に問題があります。リモート サーバーでメイクファイルを実行する必要があります。コマンド「channel_request_exec」でそれを行います:

int SSHExecCmd (void(* MessSender)(char* CurMessage, bool IsError, CWnd* MainWnd),ssh_session session,  CString & ShellEcho, char * cmd, CWnd* MainWnd)
{
    ssh_channel channel;
    int rc;
    channel = ssh_channel_new(session);
    if (channel == NULL) return SSH_ERROR;
    rc = ssh_channel_open_session(channel);
    if (rc != SSH_OK)
    {
        ssh_channel_free(channel);
        return rc;
    }
    rc = ssh_channel_request_exec(channel, cmd);
    if (rc != SSH_OK)
    {
        ssh_channel_close(channel);
        ssh_channel_free(channel);
        return rc;
    }
    char buffer[256];
    unsigned int nbytes;
    nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
    while (nbytes > 0)
    {
        if (fwrite(buffer, 1, nbytes, stdout) != nbytes)
        {
            ssh_channel_close(channel);
            ssh_channel_free(channel);
            return SSH_ERROR;
        }
        nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
    }
    if (nbytes < 0)
    {
        ssh_channel_close(channel);
        ssh_channel_free(channel);
        return SSH_ERROR;
    }
    return SSH_OK;
}

Makefile はルートにあります。

all: mpi_cuda.o pattern2d.o
        mpicc mpi_cuda.o pattern2d.o -o mpi_cuda -lrt -lpthread -L/opt/cuda/lib64 -lcudart -lm

mpi_cuda.o: mpi_cuda.c
        mpicc -g -std=c99 -D_GNU_SOURCE -I/opt/cuda/include -c $< -o $@

pattern2d.o: pattern2d.cu
        nvcc -g -c $< -o $@

コマンド「make」を送信し、エコーを受信します。

mpicc -g -std=c99 -D_GNU_SOURCE -I/opt/cuda/include -c mpi_cuda.c -o mpi_cuda.oda

しかし、何も起こりません (コンパイルは実行されません)。

私がパテで作った場合:すべてがうまくいきます。エコー:

make
mpicc -g -std=c99 -D_GNU_SOURCE -I/opt/cuda/include -c mpi_cuda.c -o mpi_cuda.o
mpi_cuda.c: В функции ‘main’:
mpi_cuda.c:148: предупреждение: недостаточно аргументов для указанного формата
nvcc -g -c pattern2d.cu -o pattern2d.o
mpicc mpi_cuda.o pattern2d.o -o mpi_cuda -lrt -lpthread -L/opt/cuda/lib64 -lcudart -lm

これを解決するにはどうすればよいですか?

4

2 に答える 2

1

libssh には慣れていませんが、環境の設定が異なるためエラーが発生する可能性があるため、シェルを介して明示的に make を実行すると役立つ場合があります。

コマンド ( make?) を次のように変更してみてください。

bash -c make

それがうまくいかない場合は、試してください

bash -c "export > env.txt ; make > make_out.txt 2> make_err.txt"

次に、それらのファイルが表示されたかどうか、およびそれらに何が含まれているかを確認してください。これにより、適切なヒントが得られるはずです。

機能しているケースと機能していないケースがある場合は、両方のケースからこれらのファイルを取得し、それらを比較します (例: とdiff -u)。

bashを使用していない場合はbash、使用するシェルに変更します(その場合-c、コマンド文字列を指定するスイッチが正しいかどうか、環境を表示するコマンドが正しいかどうかを確認します)。export


以下のコメントに基づく: 一部の環境変数は対話型シェルに対してのみ設定されるため、env.txt に違いがある可能性があります。たとえば、私の Ubuntu ボックスでは、.bashrc の先頭に次のような行があります。

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

これらの必要な環境変数のいずれかがその行の後に .bashrc に設定されていて、ssh 接続が非インタラクティブ (疑似 tty なし) である場合、これらは設定されません。

この場合、これらの環境変数セットを~/.profile、または~/.bashrc上記のようなテストの前に移動します。またman bash、初期化ファイルに関するものを読んでください(そのような~/.bashrc)。

他の解決策は、ssh-session をインタラクティブにすることです。これは、libssh のこのページに記載されていると思います: http://api.libssh.org/master/libssh_tutor_shell.html

于 2013-01-20T08:46:45.103 に答える
1

非対話型シェルを開いて、そこで実行することをお勧めします。見る

http://api.libssh.org/master/libssh_tutor_shell.html

于 2013-01-20T13:19:53.007 に答える