Невозможно правильно связать внешнюю библиотеку с QtCreator - неразрешенный внешний символ LNK2001 - PullRequest
0 голосов
/ 29 марта 2020

Я боролся с этой проблемой в течение нескольких месяцев и даже имел контакт с разработчиком библиотеки, который тоже не мог помочь.

Я пытаюсь связать библиотеку DDS eProsima FastRTPS v1.9 в мой проект Qt. Это работало ранее, но не работает, так как я обновил FastRTPS 1.6 до 1.9 и переключился на 64-битный компилятор MSV C 2017 . Проблема возникает при использовании в моей функции указанного класса c, класса PublisherAttributes, с использованием этого кода:

// Create Publisher
PublisherAttributes Wparam; // <========== CAUSING 6 LINKER ERRORS LNK2001 unresolved ext. symbol
Wparam.topic.topicKind = NO_KEY;
Wparam.topic.topicDataType = myType.getName();
Wparam.topic.topicName = "PositionTopicPubSubTopic"; // Topic Name (Stil: "<plugin_name>PubSubTopic")
Wparam.topic.historyQos.kind = KEEP_LAST_HISTORY_QOS;
Wparam.topic.historyQos.depth = 30;
Wparam.topic.resourceLimitsQos.max_samples = 50;
Wparam.topic.resourceLimitsQos.allocated_samples = 20;
Wparam.times.heartbeatPeriod.seconds = 2;
Wparam.times.heartbeatPeriod.nanosec = 200*1000*1000;
Wparam.qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS;

Этот фрагмент кода соответствует способу, которым издатель создается в примере кода из библиотеки. , Но возникают следующие ошибки (после очистки решения, повторного запуска qmake и перестройки):

PositionTopicPublisher.obj:-1: Fehler: LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __cdecl eprosima::fastrtps::HistoryQosPolicy::addToCDRMessage(struct eprosima::fastrtps::rtps::CDRMessage_t *)" (?addToCDRMessage@HistoryQosPolicy@fastrtps@eprosima@@UEAA_NPEAUCDRMessage_t@rtps@23@@Z)".
PositionTopicPublisher.obj:-1: Fehler: LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __cdecl eprosima::fastrtps::ResourceLimitsQosPolicy::addToCDRMessage(struct eprosima::fastrtps::rtps::CDRMessage_t *)" (?addToCDRMessage@ResourceLimitsQosPolicy@fastrtps@eprosima@@UEAA_NPEAUCDRMessage_t@rtps@23@@Z)".
PositionTopicPublisher.obj:-1: Fehler: LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __cdecl eprosima::fastrtps::DataRepresentationQosPolicy::addToCDRMessage(struct eprosima::fastrtps::rtps::CDRMessage_t *)" (?addToCDRMessage@DataRepresentationQosPolicy@fastrtps@eprosima@@UEAA_NPEAUCDRMessage_t@rtps@23@@Z)".
PositionTopicPublisher.obj:-1: Fehler: LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __cdecl eprosima::fastrtps::TypeConsistencyEnforcementQosPolicy::addToCDRMessage(struct eprosima::fastrtps::rtps::CDRMessage_t *)" (?addToCDRMessage@TypeConsistencyEnforcementQosPolicy@fastrtps@eprosima@@UEAA_NPEAUCDRMessage_t@rtps@23@@Z)".
PositionTopicPublisher.obj:-1: Fehler: LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __cdecl eprosima::fastrtps::TypeIdV1::addToCDRMessage(struct eprosima::fastrtps::rtps::CDRMessage_t *)" (?addToCDRMessage@TypeIdV1@fastrtps@eprosima@@UEAA_NPEAUCDRMessage_t@rtps@23@@Z)".
PositionTopicPublisher.obj:-1: Fehler: LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __cdecl eprosima::fastrtps::TypeObjectV1::addToCDRMessage(struct eprosima::fastrtps::rtps::CDRMessage_t *)" (?addToCDRMessage@TypeObjectV1@fastrtps@eprosima@@UEAA_NPEAUCDRMessage_t@rtps@23@@Z)".
..\..\bin\plugins\PositionTopic.dll:-1: Fehler: LNK1120: 6 nicht aufgelöste Externe

Все эти ошибки происходят в методе "AddToCDRMessage" из разных классов в коде QosPolicy (который я никогда не использую напрямую, но который конструктор Publisher использует, очевидно).

Вот как я пытаюсь связать FastRTPS в файле моего проекта (.pro):

#### FASTRTPS EINBINDUNG ####
QMAKE_CXXFLAGS += '/DFASTRTPS_NO_LIB'

INCLUDEPATH += "F:/DEV/prog/FastRTPSv1.9/include"
DEPENDPATH += "F:/DEV/prog/FastRTPSv1.9/include"

LIBS += -L"F:/DEV/prog/FastRTPSv1.9/lib/x64Win64VS2017" -lfastrtps-1.9
PRE_TARGETDEPS += 'F:/DEV/prog/FastRTPSv1.9/lib/x64Win64VS2017/fastrtps-1.9.lib'

О флаге "\ DFASTRTPS_NO_LIB" Я пытаюсь передать: разработчик FastRTPS сказал мне отключить автоматическое связывание c зависимостей FastRTPS с использованием этого флага. Это потому, что без этого флага я получаю «уже определенные» ошибки, даже когда связываю только одну библиотеку (FastRTPS). Он рекомендовал добавить флаг и включить зависимости самостоятельно, но это не решило проблему должным образом. При использовании флага и дополнительном включении библиотек зависимостей (а именно, FastCDR, FastDDS, foonathan_memory et c.) Это снова приводит к «уже определенным» ошибкам. Использование флага и только включение FastRTPS приводит к 6 ошибкам, упомянутым здесь.

Могу ли я что-нибудь исправить, или это проблема библиотеки? Большое спасибо ...

РЕДАКТИРОВАТЬ: Кстати, я уже пытался скомпилировать пример "HelloWorld" из FastRTPS, но я получаю те же ошибки. Поэтому я думаю, что это либо способ, которым я пытаюсь связать библиотеку / библиотеки, либо проблема самой библиотеки ...

...