0

私は単純な間違いを犯したと思いますが、どれを取得していません..とにかく、私はライブラリに取り組んでおり、プロジェクトの Makefile を構築するために cmake を使用しています: https://github.com/immapoint/ NaNO3/ブロブ/マスター/CMakeLists.txt

ライブラリをコンパイルすると、すべてが正常に機能します。次のファイルをビルドします。

bin/libNaNO3.dll
lib/libNaNO3.dll.a (I don't like that name as well)

全体をテストするために、同じく cmake を使用して別のプロジェクトをセットアップしました。https://github.com/immapoint/NaNO3TestApp/blob/master/CMakeLists.txt

ライブラリをテストするためのメイン ファイルは次のようになります: https://github.com/immapoint/NaNO3TestApp/blob/master/src/main.cpp

しかし、メイン ファイルのコンパイルに関しては、次のエラーが発生します。

CMakeFiles/NaNO3TestApp.dir/objects.a(main.cpp.obj):main.cpp:(.text+0xbf): undefined reference to `nano::Event<int>::attach(std::function<void(int)> *)`
CMakeFiles/NaNO3TestApp.dir/objects.a(main.cpp.obj):main.cpp:(.text+0xd3): undefined reference to `nano::Event<int>::notify(int)`
[...]ld.exe: CMakeFiles/NaNO3TestApp.dir/objects.a(main.cpp.obj): bad reloc address 0x8 in section `.rdata'

このエラーは、make/cmake を使用してプロジェクトをビルドしている場合でも、ソース ファイルを直接コンパイルしている場合でも発生します。

g++ -Wall -pedantic -ansi -std=c++0x main.cpp [-L./lib -I./include] -lNaNO3 

したがって、問題はcmakeではなくldにあるようです。私は CMake バージョン 2.8 と GCC バージョン 4.7.2 を含む MinGW を使用しています。

追加情報:

-fPIC を使用したコンパイラ出力: -fPIC

4

1 に答える 1

1

これは、CMake やリンカーとは関係ありません。nano::Eventテンプレートはコンパイル時にインスタンス化されるため、メンバー関数の定義は別のソース ファイルではなく、ヘッダーに含める必要があります。リンカーがそこに到達するまでには、手遅れです。

詳細な説明については、テンプレート クラスの実装と宣言を同じヘッダー ファイルに配置する必要があるのはなぜですか? を参照してください。およびhttp://www.parashift.com/c++-faq-lite/templates-defn-vs-decl.html

于 2013-03-14T22:23:36.427 に答える