問題タブ [undefined-reference]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 呼び出し元プログラムからのライブラリ クラス メンバー エラーへの未定義参照
以下に追加の質問、2011 年 4 月 11 日
C をサポートできるようにする必要がありますが、共有ライブラリ DLL/Sos とテスター プログラムのクロスプラットフォーム セットを C++ で開発しています。ライブラリはオブジェクト コードとしてのみ出荷されますが、テスター プログラムはソースと共に出荷されるので、私たちの顧客はサンプルコードを持つことができます。このため、実行時にロードされるライブラリ、つまり dlopen()/LoadLibraryA() を使用した動的リンクを設計しています。
Umbutu 10.04 で g++ 4.4.3-4 を使用し、Vista/64 (32 ビット モード) で VC++ 2008 を使用しています。
すべてが Windows で問題なく動作するようです (現在)。ただし、Linux でコンパイルすると、特定できないエラーが発生します。
テスターとライブラリには、複数の .cpp と .h でコード化された複数のクラスがあります。メイン エントリ ポイントを除くライブラリ内のクラスとほとんどすべては、名前空間 DISCOVER_NS にあります。
プロジェクトの簡単なスケッチを次に示します。
最初に、認めます。コードが読みやすくなるように、名前の束を短くしました。
発見.cpp
タイプ DiscoverObject の theMainObject と呼ばれるポインタを持つクラス オブジェクトを作成します。
MainObject を呼び出し元プログラムに void* として返す extern "C" 関数があります。
DiscoverObject にはいくつかのメソッドがあり、別の cpp と .h にある他のクラスをインスタンス化します。特定のメソッドの 1 つに Hello() という名前が付けられており、これは期待どおりの動作を行い、"hello" テスト メッセージを出力します。
tester.cpp
ライブラリへのハンドルを取得します
MainObject を返す関数への関数ポインタを取得します。
関数 (ポインター) を実行し、返されたアドレスを void* から DISCOVER_NS::DiscoverObject* aDiscoverObject にキャストします。
aDiscoverObject->Hello() を実行します。
私はコンパイルします:
CC = @g++
gflags = -g3
cflags = -fPIC -Wall -pedantic
lib_linkflags := -shared -fPIC -lstdc++ -lrt -lpthread -rdynamic
tester_linkflags := -ldl -lpthread
定義 = -D_ linux _ -D_DEBUG -D_IPC_ARCH_INTEL=1 -D_THREAD_SAFE
コンパイルすると、次のエラーが表示されます: *Tester.cpp:142: undefined reference to `Discover_NS::DiscoverObject::hello()'*
また、discover.so から他にも未定義の参照エラーがたくさん出ます。たとえば、次のようになります。
SO extern "C"で事実上すべてを作成しようとしました。変わりはない。
次のようなステートメントをdiscover.cppに入れてみました: extern void Discover_NS::OtherClass::method( args ); しかし、それは「クラス外の宣言は定義ではありません」というエラーについてのエラーを私に与えます。
コードを見るのに役立つことはわかっていますが、投稿するために何か小さなものを作り上げる時間が必要です。
この混乱を解決するためのアイデアを提供できる人はいますか?
ありがとう、
ウェス
Dmitry の解決策はすべての修正ではありませんでしたが、解決策に必要な要素でした。メイクファイルを調べたところ、意図せずに重複した行がいくつか見つかりましたが、それらは削除しました。また、コンパイル手順にコード化された -o のパスが間違っていた 2 つの「タイプミス」が見つかりました。壊れた手順で logger.cpp と RemException.cpp がコンパイルされました。
その後、本当のバグを見つけました。Discover ディレクトリにあるすべての .cpp をコンパイルしていないという事実を完全に見逃していました。すべての nit-pics を削除するのにかなりの時間がかかりましたが、今ではメイクファイルから問題なくコンパイルできます。
元の質問の新しいバージョン: makefile を介して動作することがわかったので、makefile が行っているのと同じことを行うように Eclipse に指示するにはどうすればよいですか?
ありがとうドミトリー。
ウェス
さて、私の問題はまだここにあります。
Dmitry (@Dmitry) の提案を使用してコードをコンパイルしています。ただ、それらは別の問題を引き起こしているようです。実行時に、ライブラリをメインのテスト プログラムに動的にリンクさせたいと考えています。-l Discover -l EdgeIOをリンクに追加すると、すべてがコンパイルされますが、静的リンクが得られます。
参考までに、未使用の「pi」は、SOに浮動小数点数が含まれているため、浮動小数点サポートでコンパイルされます。呼び出し元が浮動小数点数を使用したい場合に必要です。浮動小数点を含めてg ++をcomkpileに強制するより良い方法はありますか?
Dmitry が見つけてくれた多くのバグを修正した後、次の出力が得られます。
Eclipse から同じ一連のエラー メッセージが表示されます。
RemKonTester.cpp には、これらの項目が宣言されているすべての .h が含まれています。私は宣言extern "C"でそれらを試しましたが、そうではありませんでした。
助けを期待して、
ウェス
c - Cエラー:関数への参照が定義されていませんが、定義されています
単純なプログラムですが、このコンパイラエラーが発生し続けます。コンパイラーにMinGWを使用しています。
これがヘッダーファイルpoint.hです:
そしてここにpoint.cがあります:
そして、ここでコンパイラの問題が発生します。私は次のことを続けています。
testpoint.c:'create(double x、double y)'への未定義の参照
それはpoint.cで定義されていますが。
これはtestpoint.cと呼ばれる別のファイルです:
問題が何であるかについて私は途方に暮れています。
c - SSL_library_initおよびSSL_load_error_stringsへの未定義の参照
OpenSSLコードを実装していて、必要なヘッダーファイルをすでにインクルードしていますが、それでも*のようなエラーが発生します。
未定義の参照
SSL_library_init
コンパイルエラーではなく、リンクエラーだと思います。
slickeditorを使用してLinuxボックスに実装しています。
c++ - シンボルの欠落エラー(未定義の参照)
DS.hでの宣言とDS.cppでの実装を使用してクラスDSを定義しようとしています。コードは非常に小さいので、次のリストを参照してください。
と、
主なプログラムは次のとおりです。
このプログラムをコンパイルしようとすると、次のエラーが発生します。
ここで、DS.cppからすべてのコードを削除してDS.hに貼り付けると、すべてが正常にコンパイルされます。私が間違っていることは何ですか?
qt - Qt:シグナルとスロットエラー:`vtableforへの未定義の参照
このリンクからの次の例:http://developer.kde.org/documentation/books/kde-2.0-development/ch03lev1sec3.html
結果:
vtableは仮想関数用です、AFAIK、ここでのエラーの理由は何ですか?
c++ - C++での未定義の参照コンパイラエラー
コードをコンパイルしようとすると、以下のエラーメッセージが表示されます-
関数'__static_initialization_and_destruction_0':home / user / main.cpp:50:'PhysEng2D :: PhysEng2D(void)'への未定義の参照
50行目の唯一のコードは-
PhysEng2Dのヘッダーファイルは-
そして、残りのPhysEng2Dの始まりは-
(私はそれらが関連しているとは思わなかったので、私は完全にメソッドを含めませんでした)
申し訳ありませんが、これはおそらく私が作成している非常に愚かな小さなエラーであることを認識しています。
g++ - `SetTextColor@8'への未定義の参照
Windowsでg++を使用してc++プログラムをコンパイルしているときに、「 `SetTextColor@8'への未定義の参照」エラーが発生しました。完全なエラーログはここにありますhttp://pastebin.com/DCwHKkeE 私はいくつかのライブラリファイルが欠落していると思いますが、どれがどれかわかりません。助けてください
c++ - ローカル オブジェクトへの未定義の参照
nvcc を使用してプロジェクトをリンクする際に問題が発生しています。それらは、プロジェクト内で定義されたシンボルで発生します。cuda_bvh_constru.o ファイルでいくつかの関数シンボルが定義されています。これは、関連する関数の nm 出力です。
オブジェクトが正しく渡されていると思うので、これらのシンボルがリンカーによって検出されない理由がわかりません。これらのオブジェクトを配置するために必要な特定の順序はありますか? それとも別のものですか?
c++ - ポインタとリンクリストをパラメータとして渡すのに役立ちます、未定義の参照c ++
未定義の参照を示すエラーメッセージが表示されます
これが私がそれを使おうとしている方法です:
エラーは、私が暗号化を呼び出しようとしたところから発生しています。
暗号化機能は次のとおりです。
そして、ここでクラスがどのように定義されているかを確認できます。
ここでの私の目標は、暗号化機能を使用してデッキの要素にアクセスできるようにすることです。
c++ - そこにないものへの未定義の参照エラーが発生します
このコードをコンパイルしようとすると
このエラーが発生します
analysis2.cpp:13: `FileParameters :: FileParameters()'への未定義の参照
なぜそれは私にその未定義の参照を与えるのですか?FileParametersはAnalysis2に含まれるクラスであり、それが役立つ場合は、Analysis2ヘッダーファイルで定義されたFileParametersオブジェクトがあります。