1

私は Makefiles と autoconf を使用することに非常に慣れていません。Camellia イメージ ライブラリを使用しており、コードをそのライブラリに静的にリンクしようとしています。Camellia イメージ ライブラリで「make」を実行すると、/usr/local/lib ディレクトリ内に libCamellia.a、.so、.la、および .so.0.0.0 ファイルが作成されます。これは、ライブラリを使用してコードをコンパイルするために使用するコマンドです。

gcc -L/usr/local/lib -lCamellia -o myprogram myprogram.c

これは問題なく動作しますが、静的にリンクしようとすると、次のようになります。

gcc -static -L/usr/local/lib -lCamellia -o myprogram myprogram.c
/tmp/cck0pw70.o: In function `main':
myprogram.c:(.text+0x23): undefined reference to `camLoadPGM'
myprogram.c:(.text+0x55): undefined reference to `camAllocateImage'
myprogram.c:(.text+0x97): undefined reference to `camZoom2x'
myprogram.c:(.text+0x104): undefined reference to `camSavePGM'
collect2: ld returned 1 exit status

Camellia のソース コードを変更しようとしていて、自分のバージョンと彼らのバージョンを比較したいので、静的にリンクしたいと考えています。それで、グーグルで調べた後、 AM_DISABLE_SHARED をconfigure.inファイルに追加してみました。しかし、./configure を実行した後でも、まったく同じ Makefile が得られます。「make install」した後でも、上記と同じ結果が得られます。

オリジナルの Camellia ソース コードをコンパイルしたバージョンと、変更したバージョンのコードの 2 つのバージョンを取得する簡単な方法は何ですか? 静的ライブラリが機能するはずだと思います。静的ライブラリを機能させる簡単な方法はありますか、それとも私の問題に対する他の簡単な解決策はありますか? 自分のバージョンを元のバージョンと比較するたびに、「make」と「make install」を再実行したくありません。

4

2 に答える 2

1

autoconf追加後、AM_DISABLE_SHAREDconfigure、make、make install の前に再実行しましたか? configure --disable-dynamic共有ライブラリの構築を停止するために使用することもできます。以前にインストールしたものは必ず削除してください -make uninstallそうする必要があります。他に明らかに間違っているものは見当たりません。明示的にしてみてください:

gcc -static -o myprogram myprogram.c /usr/local/lib/libCamellia.a

または、2 つのステップに分けて、 の記号myprogram.oが期待どおりであることを確認しますnm myprogram.o

于 2010-05-16T03:18:24.643 に答える
1

私はautoconfが苦手で、静的にリンクしようとして失敗する理由がわかりませんが、動的にリンクする場合は、共有ライブラリを使用すると実際に問題が少し解決すると思います.

オリジナルの Camellia コードと変更したバージョンの 2 つの共有ライブラリを作成するだけです。それらを2つの異なるディレクトリに置き、実行時にmyprogramLD_LIBRARY_PATH(またはライブラリを見つけるために使用しているもの)を切り替えるか、シンボリックリンクを保持してライブラリ間で切り替えるかのいずれかを選択できます/usr/local/lib。静的ライブラリに対するこれの利点 (これが機能するという事実は別として) は、変更したコードをいじくり回し、共有ライブラリを再構築し、再構築する必要なく実行できることmyprogramです (署名を変更しない限り)。

PS実験:共有ライブラリを使用しているかのように、共有ライブラリを削除してフラグ/usr/local/libなしで再構築してみてください。-static理論的には、これにより gcc が代わりに静的ライブラリを使用するようになります。この結果から、静的リンクが失敗する理由の手がかりが得られる場合があります。

于 2010-05-16T07:48:36.170 に答える