Eclipse-CDT/C ++:正しい.oファイルが作成され、リンカーに渡されるにもかかわらず、未定義の参照エラー

最初は:私は 既にコンパイルされたライブラリを使用していません。

ここに状況があります:私はこのようなフォルダ構造を持つeclipse CDTのC ++プロジェクトを持っています:

project
  somefoldername
    src
    include
  library
    src
    include

somefoldername/src and library/src are defined as source folders and somefoldername/include as well as library/include are defined as include folders (under C/C++ General->Paths and Symbols, which also affects the compilers -I option).

"library"フォルダには、自分のコードで使用されるライブラリのソースコードが含まれています( "somefolder"にあります)。さて、プロジェクト全体のコンパイルはうまくいきますが、リンクは、ライブラリのソースの "未定義の参照"エラーの一揃いとクラッシュします。

見つからない関数が見つかるはずの* .oファイルが作成され、その後にリンカにも渡されますが、未定義の参照エラーが発生します。

私は間違って何をしていますか?

Edit: Updated to current configuration and the attempts to solve the problem.

Edit2: The accepted answer helped me out a bit, but the biggest problem seemed to be the "linking everything at once"-policy followed by eclipse. I went to autoconf and built the library first, before linking it to the main application. Although it's more work, it's a cleaner approach.

1
最後に、はい。私は、図書館の作者と一緒にそれを調べました。いくつかのエラーは、ライブラリが(あなたのポイント1を作った)ソースコードを使って部分的に正しいと思われる定義から来ましたが、奇妙なものはまだ残っていません。だから私は通常のGCCツールチェーンからautoconfに行き、ライブラリを別々にビルドしました。これはどういうわけかトリックでした。おそらくすべての.oファイルを一度にリンクすると問題につながるでしょう。だから、それは "extern C"の部分ではありませんでしたが、あなたの最初の推測は問題の一部を解決しました。
追加された 著者 aRestless,
Q:これはまだ解決しましたか?
追加された 著者 paulsm4,

1 答え

3つの可能性:

1)「未定義」シンボルは実際にあなたのライブラリにありません

 This is unlikely, but you can verify using the "nm" Linux command

2)Eclipseでライブラリ検索パス( "dash-big-L")を正しく設定していない

2
追加された
1)彼らは図書館にいる2)それは私の推測だろう。どのように設定する必要がありますか? 3)ライブラリにはcコードが含まれていますが、私はそれを直接使用していません。ライブラリ内で正しく認識されています。
追加された 著者 aRestless,
上記のとおり、私はコンパイルされたライブラリを使用しません。 "library"フォルダにはソースコードが含まれているため、2)のリンクはあまり役に立たないでしょうか?
追加された 著者 aRestless,
私は図書館全体のソースには行かなかったが、私が発見したソースの使用法は、インクルードを「extern C」に明確に包んでいる。はい。上記のように、ライブラリのソース用に.oファイルが生成されています。私が上で書いたように、すべての.oファイルはリンカに渡されます。私はnmコマンドを扱うことができないことを認めなければなりません。なぜなら、私はドキュメンテーションの何かを隠さず、何千もの読めない行を与えるからです。もしあなたが求めているのであれば、明らかに関数名を変更する。
追加された 著者 aRestless,
ライブラリにCコードが含まれていて、プログラムがC ++を使用していて、グローバル名と関数名を "extern C"で明確に定義していない場合は、問題はカーテンです3)。 Q:あなたの "ライブラリ"ソースには.oファイルが生成されていますか?Q:外部シンボルにはCまたはC ++リンケージがありますか?(あなたの.oファイルには "nm"を使用できます)? oファイル(明示的に各.oファイルを含む)をあなたのリンクに入れますか?
追加された 著者 paulsm4,
OK: "nm * .o | less"にmangled(C ++)の名前が表示されている場合、 "extern" C *は動作していないように見えます。 Q: "extern C"関数のプロトタイプと変数宣言は.hヘッダーファイルにあります(ローカルではなく、* .c/.cppソース)。 Q:*すべてのソースコードにヘッダファイルを#includeしていますか?(例:main.cppと "myfunctionsrc.c")???
追加された 著者 paulsm4,
@aRestless:これを実行してください:1) "解決されていない"リンクエラーを例として選択する。2)対応する.oファイルが構築されているかどうかを確認する。3).oファイルの "nm XXX.o | less"シンボル、3).oファイルのシンボルがマングル化されているかどうかを判断する(C ++)かどうか(Cリンケージ)4).hヘッダに "extern C"があるかどうかを確認する5)ヘッダがインクルードされているかどうか確認するXXX.cppとアプリケーションソースの両方かどうか、6)結果をポストバックします(リンクエラーと "extern C"宣言をカット/ペーストします)。 OK?
追加された 著者 paulsm4,