2

Ubuntu 11.10 (Linux バージョン 3.0.0-12-generic-pae カーネル) を使用して開発している C プログラムがあります。Debian 3.1 (Linux バージョン 2.4.24-om2) がインストールされ、Intel(R) Pentium(R) 4 CPU 3.20GHz プロセッサを使用するクラスタでそのプログラムを実行する必要があります。

問題は、プログラムに必要な GSL ライブラリがインストールされていないため、Debian クラスターでコンパイルできないことです。また、root 権限なしでインストール (または使用) する方法もわかりません。

Ubuntu でコンパイルした実行可能ファイル (または、単純なhello worldプログラム) を実行しようとすると、クラスターでの実行時にスローされるすべての gcc オプションを使用してコンパイルしても機能しません。

gcc --save-temps -fverbose-asm hello_world.c -o hello_world

Ubuntu でコンパイルしたプログラムを実行しようとすると、次のようにスローされます。

floating point exception

更新: -static フラグを使用してコンパイルすると、次のエラーが表示されます。

FATAL: kernel too old
Segmentation fault.

ですから、私が使用している GSL のすべての機能を再実装するよりも良いことができるでしょうか。

4

5 に答える 5

1

エラーの場合

FATAL: カーネルが古すぎる

セグメンテーション違反。

続きます。ホスト マシンで実行されている Linux のカーネル バージョンと、使用して作成された実行可能ファイルに必要なサポート バージョンを確認します。

ldd '実行可能ファイル'

于 2012-12-09T19:33:23.217 に答える
1

あなたが直面していることがうまくいかないことはわかりませんが、クロスコンパイルを含まないと私が考えることができる唯一のことは、行に a-staticを追加することgccです。

于 2011-11-14T20:29:21.290 に答える
1

コードが実際に実行されており、main() が呼び出される前に終了しない場合は、コードにデバッグ出力ステートメントをいくつか入れて、コードがどこで失敗したかを正確に知ることができます。

実行可能ファイルを可能な限り移植可能にするために、静的リンクにする必要があります。そうすれば、多くの外部依存関係がなくなります。もちろん、実行可能なサイズは少し大きくなります。それでもうまくいかない場合は、コンパイル対象のアーキテクチャが、クラスタが実行されているものと同じであることを確認してください。つまり、クラスタは 64 ビットの Intel っぽいプロセッサを実行していますか? それともsparcか何かですか?

静的コンパイルを使用しても、完全に移植できるわけではありません。クラスターで実行されている glibc のバージョンを把握し、それに対してアプリケーションをビルドできれば、より幸運に恵まれます。クラスター上にあるのと同じバージョンの gcc を使用してアプリケーションをビルドできれば、さらに安全になります。基本的に、ツールチェーンをクラスター システムのツールチェーンとできるだけ同じにする必要があります。

更新: わかりました。問題はほぼ確実に、コンパイルに使用している glibc が 2.4 カーネルを実行するには新しすぎることです。それは驚くべきことではありません。前の段落で述べたことを実行することでこれを修正することは可能ですが、コンパイラ フラグだけでこれを実行できる可能性があります。gccのオプションについて説明しているこの質問を見つけました。--enable-kernel=VERSIONただし、このオプションの経験はありません。

于 2011-11-14T20:43:39.673 に答える
0

Linuxの移植性にはいくつかの問題があります。カーネルABIは変化しており、ライブラリとツールチェーンはディストリビューションからディストリビューションへ、そしてリリースからリリースへと変化しています。

Linuxは通常、かなり下位互換性があるため、最も信頼できるアプローチは、古いシステム(または古いバージョンのLinuxに基づくchroot環境)でコードをコンパイルすることです。

また、 PortableLinuxBinariesの記事を読むことをお勧めします

于 2011-11-14T21:59:54.320 に答える
0

最後に、ルート権限なしでGSLライブラリをコンパイルして解決しました。ソースをホーム ディレクトリのフォルダーに解凍し、_build ディレクトリを作成し、../configure を実行してから make を実行しました。

_build 内で作成された .libs ディレクトリのファイルを新しい ~/path/lib ディレクトリにコピーし、次を使用しました。

find -name "*.h" -type f -exec cp {} ~/path/include/gsl \;

GSL ソース フォルダに生成されたすべてのヘッダー ファイルをコピーするには (もっと良い方法があったはずです)。

次に、gcc の環境変数 (C_INCLUDE_PATH、LIBRARY_PATH) を設定しようとしましたが、何らかの理由でそれらを保存できませんでした (使用してエクスポートし、~/profile および ~/.bash_profile ファイルで変更しようとしました)。

そこで、-I および -L gcc オプションを使用して 2 つのフォルダーをリンクしました。このように機能しました。

于 2011-11-15T20:46:11.980 に答える