使用现代 C++ 时 RTI DDS 中出现未定义的引用错误 API

Undefined reference errors in RTI DDS when using modern c++ API

我使用以下方法生成了 RTI 代码:

/opt/rti_connext_dds-6.0.0/bin/rtiddsgen -d GENERATED_CODE_DIR -language C++11 -replace IDL_DIR

我的 CMake 文件:

link_libraries(gsl gslcblas nnz12 occi clntsh dl nddsc nddscpp2 pthread)
add_definitions(-DRTI -DRTI_64BIT -DRTI_LINUX -DRTI_UNIX -D_GLIBCXX_DEBUG)
include_directories(-isystem /opt/rti_connext_dds-6.0.0/include/ndds)
include_directories(-isystem /opt/rti_connext_dds-6.0.0/include/ndds/hpp)
include_directories(-isystem /opt/rti_connext_dds-6.0.0/include/ndds/hpp/rti)
include_directories(-isystem /opt/rti_connext_dds-6.0.0/include/ndds/hpp/dds)

现在编译时,出现以下错误:

undefined reference to `rti::domain::register_type_plugin(dds::domain::TDomainParticipant<rti::domain::DomainParticipantImpl>&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, PRESTypePlugin* (*)(), void (*)(PRESTypePlugin*))'
undefined reference to `dds::core::PreconditionNotMetError::PreconditionNotMetError(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: error: ld returned 1 exit status

有什么我遗漏的吗?

问题出在 ABI 上。我正在使用 gcc10.2。 我通过添加定义解决了这个问题:

_GLIBCXX_USE_CXX11_ABI 0

问题是由于 RTI 库和 occi.so 的 ABI 不同造成的。 通过使用 occi_gcc53.so 而不是 occi.so 库解决了问题。