私は、問題はここ
あるものができ数字出ていないです:
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_tmpdir
と make_temp_file
の定義が必要であることを発見しました。したがって、make-temp-file.o
をlibiberty.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
をリンクすることに意味がないことを示しています。しかし、オブジェクトファイルを最初にリンクする のルールに従うと、後でライブラリがあり、リンクにライブラリ を必要としないことで害はありません。不要なライブラリは、 またはリンクする共有ライブラリに何も追加しません。
Sooooo ...あなたは何を期待していますか?あなたのオブジェクトの中には、いくつかの関数の定義が矛盾していることがあります。 – spectras
私はコマンドからlibiberty.aを削除し、コンパイルしました。私は問題が何であるか把握できません –