0

次のような共有および静的ライブラリに関する関連チュートリアルを読みました。

「gnu コンパイラ [gcc] で共有および静的ライブラリを作成する」

「静的、共有、動的、およびロード可能な Linux ライブラリ」

ただし、残念ながら、彼らが使用したすべての例は、1 つの関数と .c ファイルです。

2 つの質問があります。

(1) example1.c のように、さらに 2 つの関数を含む 1 つのファイルがある場合

void ctest11(int *i)
{ *i = 5; }

void ctest12(int *i)
{ *i = 5; }

exmaple1.c を libexample1.so にコンパイルした後、その中で ctest11 と ctest12 を呼び出すことができますか?

(2) さらに 2 つの関数を含む 1 つのファイルがある場合、そのうちの 1 つは example2.c などのメイン関数です。

void ctest21(int *i)
{ *i = 5; }

void main(int *i)
{ *i = 5; }

exmaple2.c を libexample2.so にコンパイルした後、1 つの .c ファイルを ctest21 関数だけでコンパイルするのと同じですか?

(3) example3.c と exmaple4.c という 1 つのファイルがある場合、example3.c の関数は example4.c の関数を使用します。例: example3.c

void ctest31(int *i)
{ *i = ctest41(2,3); }

example4.c

int ctest41(int a, int b)
{ return a+b; }

example2.c と example3.c を libexample23.so にコンパイルするとき、ctest31 と ctest41 の両方を呼び出すことができますか?

しかし、gcc example2.c example3.o を libexample2.so にすると、ctest31 しか呼び出せないのではないでしょうか?

4

2 に答える 2

0

バジルの素晴らしい説明をありがとう。私が理解していることから、私の質問に関連して、

(a) 最初の質問 (1) については、1 つのオブジェクト ファイルに複数の関数が含まれています。libexample1.so で ctest11 と ctest12 を呼び出すことができます

libexample1.so 内の関数に可視性を設定できます。

(b) 3 番目の質問 (3) では、最初のシナリオは 2 つのオブジェクト ファイルからライブラリを作成することに関連しています。ファイル内の任意の関数を呼び出すことができます。2 つ目のシナリオは、ライブラリの作成と別のライブラリとのリンクに関するものです。リンク ライブラリを含め、ライブラリ内の任意の関数を呼び出すことができます。

(3) メイン関数のシチュエーションがまだよくわからない。「通常、メインを含む共有オブジェクトをコンパイルすることはありません。これはほとんど無意味です (libexample2.so のように)。」

私はそれがナンセンスであることを知っていました。しかし、プログラム ファイルを変更せずに、たとえば example2.c などのライブラリにコンパイルしたい場合は、それを example2.so にコンパイルし、関数 ctest21 を呼び出します。それをしてもいいですか?

example2.c

void ctest21(int *i)
{ *i = 5; }

void main(int *i)
{ *i = 5; }

ライブラリにコンパイルします。

gcc -fPIC -g -c -Wall example2.c
gcc -shared -o libexample2.so example2.o 

example2.o で crest21 関数を呼び出すことができると思います。しかし、主な機能は役に立たない。私の理解は正しいですか?

于 2013-04-10T16:37:37.763 に答える