2017-08-02 12 views
0

こんにちは私はオブジェクトファイルと.aファイルのリストからsoファイルを作成しようとしています。しかし、私はエラーが発生しています。以下は、以下のコマンドとエラーです。静的ライブラリのリストから共有ライブラリを作成する

gcc -g -shared bucomm.o filemode.o libiberty.a version.o make-temp-file.o -o liballshared.so 

make-temp-file.o: In function `choose_tmpdir': 
/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:106: multiple definition of `choose_tmpdir' 
libiberty.a(make-temp-file.o):/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:106: first defined here 
make-temp-file.o: In function `make_temp_file': 
/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:185: multiple definition of `make_temp_file' 
libiberty.a(make-temp-file.o):/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:185: first defined here 
collect2: error: ld returned 1 exit status 
+0

Sooooo ...あなたは何を期待していますか?あなたのオブジェクトの中には、いくつかの関数の定義が矛盾していることがあります。 – spectras

+0

私はコマンドからlibiberty.aを削除し、コンパイルしました。私は問題が何であるか把握できません –

答えて

0

私は、問題はここ

あるものができ数字出ていないです:

make-temp-file.o: In function `choose_tmpdir': 
/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:106: multiple definition of `choose_tmpdir' 

リンカがオブジェクトファイルmake-temp-file.oが が持っている機能choose_tmpdirを定義することを示しています既にリンクされているオブジェクトファイルですでに定義されています。リンカで の複数の定義をchoose_tmpdirにリンクさせることはできません。どの定義があなたのliballshared.soにリンクされていますか?

次へ:

libiberty.a(make-temp-file.o):/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:106: first defined here 

リンカは静的ライブラリlibiberty.aでオブジェクトファイルmake-temp-file.oはそれが はすでにchoose_tmpdirが既に定義されたリンクされたオブジェクト・ファイルであることを示しています。

次へ:

make-temp-file.o: In function `make_temp_file': 
/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:185: multiple definition of `make_temp_file' 
libiberty.a(make-temp-file.o):/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:185: first defined here 

リンカもmake-temp-file.oで定義された あるとmake-temp-file.oは以前に内から をリンクされたときにも、すでに定義されている、あなたはまた、機能make_temp_fileの複数の定義を持っていることを示しています静的ライブラリlibiberty.a

gcc -g -shared bucomm.o filemode.o libiberty.a version.o make-temp-file.o -o liballshared.so 

あなたが最初に、リンカにオブジェクトファイルmake-temp-file.oを含むライブラリlibiberty.aを与える た後、再度、リンカmake-temp-file.oを与える:あなたのリンケージコマンドであるため

これらの複数の定義のエラーの両方が起こります。

リンカにオブジェクトファイルを与えると、リンカはオブジェクトファイルをプログラムまたは共有ライブラリの中で無条件にリンクします。 リンカに静的ライブラリを与えると、静的ライブラリのオブジェクトファイルが検査され、必要なものが というものだけが抽出され、プログラムまたは共有ライブラリにリンクされます。リンカーは、既にリンクされているオブジェクトファイル内で、まだ定義されていないが ではない参照された1つ以上のシンボルの定義を静的ライブラリ から提供するオブジェクトファイルであるを必要とします。

リンカがあなたのコマンドラインでlibiberty.aになると、それはそれらのいずれかがすでに(つまり、あなたのliballshared.soにリンクされたオブジェクト・ファイルで参照される未定義のシンボル の定義を提供かどうかを確認するために、ライブラリに オブジェクトファイルを検査bucomm.oおよびfilemode.o)。 libiberty.a(make-temp-file.o)は、機能choose_tmpdirmake_temp_fileの定義が必要であることを発見しました。したがって、make-temp-file.olibiberty.aから抽出し、共有ライブラリにリンクします。

コマンドラインでmake-temp-file.oになると、無条件にリンクします。したがって、このオブジェクトファイルは が共有ライブラリで2回リンクされており、共有ライブラリで定義されているシンボルが共有ライブラリで2回定義されているため、リンクが失敗します。

あなたのリンケージははコマンドで失敗しません:libiberty.aは、すべてのオブジェクトファイルの後に来る

gcc -g -shared bucomm.o filemode.o version.o make-temp-file.o libiberty.a -o liballshared.so 

します。オブジェクトファイルはすべてに無条件でリンクされます。libiberty.aが検査されます。そしてlibiberty.aを検査したとき、リンカ 意志ない抽出し、それがを必要とされていないのでリンクlibiberty.a(make-temp-file.o)

モラル:オブジェクトファイルを先にリンクし、ライブラリを後でにリンクします。

libiberty.aを完全に削除すると、リンクが成功するとのコメントが表示されます。それが真実ならば、 は、あなたの共有ライブラリで参照されているのシンボルがbucomm.o filemode.o version.o make-temp-file.o, のいずれかで定義されているので、最初にlibiberty.aをリンクすることに意味がないことを示しています。しかし、オブジェクトファイルを最初にリンクする のルールに従うと、後でライブラリがあり、リンクにライブラリ を必要としないことで害はありません。不要なライブラリは、 またはリンクする共有ライブラリに何も追加しません。

+0

ありがとうございました。その非常に明確な説明。私を助けてくれました。 –

+0

@DineshGowdaようこそStackoverflowへ! [あなたの質問に答えたときに何をすべきですか?](https://stackoverflow.com/help/someone-answers) –

関連する問題