3

編集: それが重要な場合に備えて、明確にする必要があると思います。私はAIXUnixボックスを使用しているので、VACコンパイラーを使用しています。gnuコンパイラーは使用していません。 編集を終了


私はC/C ++でかなり錆びているので、これが単純な質問であるなら許してください。

いくつかのCプログラムから共通の関数を取り出して、共有ライブラリまたは共有オブジェクトに配置したいと思います。これをperlで行っている場合は、潜水艦をperlモジュールに入れ、必要に応じてそのモジュールを使用します。

例として、私がこの関数を持っているとしましょう:

int giveInteger()
{
    return 1034;
}

明らかにこれは実際の例ではありませんが、その機能を共有したい場合、どのように進めますか?

私には2つの選択肢があると確信しています。

  1. 共有関数をファイルに入れ、コンパイル時にメインプログラムでコンパイルします。共有関数に変更を加えた場合は、メインプログラムを再コンパイルする必要があります。
  2. 共有関数をファイルに入れ、共有ライブラリとしてコンパイルし(用語が正しければ)、メインプログラムにその共有ライブラリへのリンクを設定します。(コンパイル後に)共有ライブラリに加えた変更は、メインプログラムを再コンパイルせずに、実行時にメインプログラムに統合されます。

私はその考えを正しくしていますか?

もしそうなら、どうすればこれらの方法のいずれか/両方を完了することができますか?私はたくさん検索しましたが、自分のプログラムを他の人の共有ライブラリにリンクする方法についての情報を見つけたようですが、自分の共有関数を作成して自分のプログラムで使用できるようにコンパイルする方法はわかりません。 。

本当にありがとう!

ブライアン


編集:

結論

皆さんの助けに感謝します!他の人が恩恵を受けることができるように、私はこの投稿に(AIX上の動的共有ライブラリーのために)私のために働いているものを追加すると思いました:

共有関数をコンパイルします。

xlc -c sharedFunctions.c -o sharedFunctions.o

次に、それを共有オブジェクトにします。

xlc -qmkshrobj -qexpfile=exportlist sharedFunctions.o
xlc -G -o libsharedFunctions.so sharedFunctions.o  -bE:exportlist

次に、別のプログラムにリンクします。

xlc -brtl -o mainProgram mainProgram.c  -L. -lsharedFunctions

また、別のコメントがこのリンクを見つけるのに役立ちました。これも役立ちました:http: //publib.boulder.ibm.com/infocenter/comphelp/v7v91/topic/com.ibm.vacpp7a.doc/proguide/ref/compile_library.htm

私を助けてくれたすべての人にもう一度感謝します!

4

3 に答える 3

6

ええ、あなたは正しいです。前者は静的ライブラリと呼ばれ、後者は共有ライブラリと呼ばれます。これは、コードがコンパイル時に実行可能ファイルにバインドされていないためですが、プログラムがロードされるたびに再度バインドされます。

静的ライブラリ

ライブラリのコードを次のようにコンパイルします。

gcc -c *.c

は、オブジェクトファイルをリンクしないようにプログラムに指示しますが、コンパイルされた-c各ファイルのオブジェクトファイルを残します。.c次に、それらを1つの静的ライブラリにアーカイブします。

ar rcs libmystuff.a *.o 

man arrcsオプションの意味を教えてくれます。現在、libmystuff.aは、オブジェクトファイルのシンボルのインデックスとともに、これらのオブジェクトファイルを含むアーカイブファイル(一部のzipファイルビューアで開くことができます)です。あなたはそれをあなたのプログラムにリンクすることができます:

gcc *.c libmystuff.a -o myprogram

これで、プログラムの準備が整いました。コマンド内で静的ライブラリが表示される順序が重要であることに注意してください。私のリンク注文の回答を参照してください。

共有ライブラリ

共有ライブラリの場合、次のコマンドでライブラリを作成します

gcc -shared -o libmystuff.so *.c

必要なのはこれだけです。libmystuff.soは共有オブジェクトファイルになりました。プログラムをそれにリンクしたい場合は、/etc/ld.so.confファイルにリストされている-Lか、GCCへのスイッチによって指定されているか、LD_LIBRARY_PATH変数にリストされているディレクトリにプログラムを配置する必要があります。リンクするときは、gccに指定したライブラリ名からlibプレフィックスとサフィックスを切り取ります。.so

gcc -L. -lmystuff *.c -o myprogram

内部的には、gccは引数をGNUリンカーに渡すだけです。オプションを使用して、渡す引数を確認でき-###ます。Gccは、各サブプロセスに指定された正確な引数を出力します。

リンクプロセス(一部の処理が内部でどのように行われるか)の詳細については、LinuxGCCリンカーの回答を参照してください。

于 2009-01-06T20:23:31.327 に答える
4

3番目のオプションがあります。一般に、C++コンパイラはCルーチンをリンクできる必要があります。必要なオプションはコンパイラーごとに異なる可能性があるため、Rは細かいMですが、基本的には、次のようにg++でコンパイルできるはずです。

$ g++ -o myapp myapp.cpp myfunc.c giveint.c

...または個別にコンパイルする

$ gcc -c myfunc.c
$ gcc -c giveint.c
$ g++ -c myapp.cpp
$ g++ -o myapp myapp.o myfunc.o

関数の宣言も含める必要があります。あなたはC++でそれをします

extern "C" {
    int myfunc(int,int);
    int giveInterger(void);
}
于 2009-01-06T20:07:04.573 に答える