10

クラスの C および C++ ファイルを採点していますが、この課題では GSL ライブラリを使用しています。私のコンピュータには root 権限がないので、私の GSL ライブラリはホーム ディレクトリにインストールされています。

これは、自分でプログラムを作成する場合には問題になりません。適切な -L フラグと -I フラグを gcc に追加するだけだからです。

しかし、学生のファイルをコンパイルするとき、すべてのメイクファイルを編集したくありません。代わりに、適切なディレクトリを環境変数に入れて、シームレスに実行したいと考えています。

この目的のために、次の変数をライブラリまたはインクルードの場所と共にエクスポートしました: C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、LIBRARY_PATH、および LD_LIBRARY_PATH

しかし、学生のプロジェクトをコンパイルすると、

gcc -Wall -o MC_thread MC_thread.c -lgsl -lgslcblas -lpthread -lm

次のエラーが表示されます。

/usr/bin/ld: cannot find -lgsl
collect2: ld returned 1 exit status
make: *** [all] Error 1

gcc v 4.1.2 を使用しています。gcc v 4.4 を使用している場合、実際にはエラーは発生しませんが、その理由はわかりません。私のリンカーは次のとおりです。

ld -V
GNU ld version 2.17.50.0.6-12.el5 20061020.
4

4 に答える 4

12

環境変数 LIBRARY_PATH を使用してみることができます

man gccから(少なくともバージョン 4.4)

       LIBRARY_PATH
           LIBRARY_PATH の値は、コロンで区切られたディレクトリのリストです。
           PATH によく似ています。ネイティブ コンパイラとして構成されている場合、GCC は
           特別なリンカーを検索するときに指定されたディレクトリ
           GCC_EXEC_PREFIX を使用してファイルが見つからない場合。を使用したリンク
           GCC は、通常の検索時にもこれらのディレクトリを使用します。
           -l オプションのライブラリ (ただし、-L で指定されたディレクトリは付属します)
           最初)。

次に、プログラムを実行するときに LD_LIBRARY_PATH を使用して、ランタイム リンカーがライブラリを見つけられるようにします。

于 2010-02-09T14:35:14.293 に答える
3

上記の回答の多くは、LD_LIBRARY_PATH の使用を示唆しています。しかし、これはコンパイル時リンカ ld ではなく、動的 (実行時) リンカの環境変数であるため、正しくありません。

これを行う正しい方法は、生徒に次のようなものを追加するように要求することです。

-L$(EXTRA_LINK_DIRECTORY)

ビルド ルールを定義する時点の Makefile で。次に、コンパイル時にのようにします。

export EXTRA_LINK_DIRECORY=/home/...

于 2010-02-20T00:06:49.637 に答える
1

64 ビット マシンを使用している場合は、おそらくそれが問題です。OMM、gcc 4.1 は LIBRARY_PATH で指定されたパスを検索せず、path/../lib64 を検索します。-L を直接指定するか、ディレクトリを同じレベルで lib64 にシンボリックリンクするか、gcc 仕様を台無しにする必要があります。

http://gcc.gnu.org/ml/gcc-help/2010-11/msg00360.htmlと、g++ が LIBRARY_PATH/../lib64 を参照する理由と、これが文書化されている場所を参照してください。

(OMM、これはgcc 4.5で問題なく動作するので、後で修正されたと思います。)

于 2013-02-13T20:53:51.030 に答える
0

私のアドバイスは、学生が自分のメイクファイルで CFLAGS 環境変数をサポートするように要求することです。そうしないと失敗します。:) 次に、 CFLAGS="-Lwhatever" をエクスポートできます。

または、LD_LIBRARY_PATH を使用できます。

于 2010-02-17T18:20:46.307 に答える