1

私は OpenSplice を初めて使用し、ここから簡単なチュートリアルに準拠したいと考えていました。

https://github.com/PrismTech/dds-tutorial-cpp-ex

私は OpenSplice Community Edition をダウンロードし、release.com ファイルを入手しました。

次に、dds-tutorial-cpp-ex git リポジトリのクローンを作成し、ch1 のビルドを試みました。

$ cd ch1
$ cmake .
$ make
Scanning dependencies of target datamodel
[ 11%] Generating gen/TempControl.cpp, gen/TempControl.h, gen/TempControlDcps.cpp, gen/TempControlDcps.h, gen/TempControlDcps_impl.cpp, gen/TempControlDcps_impl.h, gen/TempControlSplDcps.cpp, gen/TempControlSplDcps.h, gen/ccpp_TempControl.h
[ 22%] Building CXX object CMakeFiles/datamodel.dir/gen/TempControl.cpp.o
[ 33%] Building CXX object CMakeFiles/datamodel.dir/gen/TempControlDcps.cpp.o
[ 44%] Building CXX object CMakeFiles/datamodel.dir/gen/TempControlDcps_impl.cpp.o
[ 55%] Building CXX object CMakeFiles/datamodel.dir/gen/TempControlSplDcps.cpp.o
Linking CXX shared library libdatamodel.so
[ 55%] Built target datamodel
Scanning dependencies of target tspub
[ 66%] Building CXX object CMakeFiles/tspub.dir/tspub.cpp.o
[ 77%] Building CXX object CMakeFiles/tspub.dir/util.cpp.o
Linking CXX executable tspub
CMakeFiles/tspub.dir/tspub.cpp.o: In function `dds::pub::detail::DataWriter<tutorial::TempSensorType>::DataWriter(dds::pub::TPublisher<org::opensplice::pub::PublisherDelegate> const&, dds::topic::Topic<tutorial::TempSensorType, dds::topic::detail::Topic> const&, dds::core::TEntityQos<org::opensplice::pub::qos::DataWriterQosImpl> const&, dds::core::status::StatusMask const&)':
/home/user/workspace/HDE/x86_64.linux/include/dcps/C++/isocpp/dds/pub/detail/DataWriter.hpp:241: undefined reference to `org::opensplice::core::DWDeleter::DWDeleter(std::shared_ptr<DDS::Publisher> const&)'
CMakeFiles/tspub.dir/tspub.cpp.o: In function `dds::topic::detail::Topic<tutorial::TempSensorType>::Topic(dds::domain::TDomainParticipant<org::opensplice::domain::DomainParticipantDelegate> const&, std::string const&, std::string const&, dds::core::TEntityQos<org::opensplice::topic::qos::TopicQosImpl> const&, dds::topic::TopicListener<tutorial::TempSensorType>*, dds::core::status::StatusMask const&)':
/home/user/workspace/HDE/x86_64.linux/include/dcps/C++/isocpp/dds/topic/detail/Topic.hpp:87: undefined reference to `org::opensplice::core::TopicDeleter::TopicDeleter(std::shared_ptr<DDS::DomainParticipant> const&)'
collect2: error: ld returned 1 exit status
make[2]: *** [tspub] Error 1
make[1]: *** [CMakeFiles/tspub.dir/all] Error 2
make: *** [all] Error 2

残念ながら、「org::opensplice::core::DWDeleter::DWDeleter(std::shared_ptr const&) への未定義の参照があります。

ライブラリは、この参照を定義libdcpsisocpp.soするリンク ターゲット ( https://github.com/PrismTech/dds-tutorial-cpp-ex/blob/master/cmake/FindOpenSplice.cmake#L56を参照) に追加されます。

HDE/x86_64.linux/custom_libフォルダーに変更して実行することで、ライブラリを再構築しましたが、make -f Makefile.Build_DCPS_ISO_Cpp_Libエラーは発生しませんでした。

なぜこのエラーが発生するのですか? どうすれば修正できますか?

私のシステムは Ubuntu 14.04 amd64 です。

OpenSplice のバージョン: OpenSplice HDE リリース V6.4.140407OSS for x86_64.linux、日付 2014-04-15

編集: 同じ問題が OpenSplice OpenSplice HDE Release V6.5.0p1 For x86_64.linux、Date 2015-03-19 に存在します。

エラーは次のとおりです。

undefined reference to `org::opensplice::core::DRDeleter::DRDeleter(std::shared_ptr<DDS::Subscriber> const&)'
undefined reference to `org::opensplice::core::TopicDeleter::TopicDeleter(std::shared_ptr<DDS::DomainParticipant> const&)'

注: クロスポスト (回答なし): http://forums.opensplice.org/index.php?/topic/2517-undefined-reference-to-orgopensplicecoredwdeleterdwdeleter/

4

1 に答える 1

7

問題は、含まれているライブラリが C++11 をサポートするようにビルドされていなかったため、C++11 の代わりに Boost 共有ポインタを使用していましたが、チュートリアル コードでは C++11 を使用していたことです。

Makefile を編集して CPPFLAGS 行にHDE/x86_64.linux/custom_lib/Makefile.Build_DCPS_ISO_Cpp_Lib追加すると、問題が修正されました。-std=c++0x

( で再コンパイルすることを忘れないでくださいmake -f Makefile.Build_DCPS_ISO_Cpp_Lib)

@yasir-majeedこれを指摘してくれてありがとう!!

于 2015-03-30T13:41:05.953 に答える