Я вызываю метод класса в общей библиотеке из другой общей библиотеки. Приложение прекрасно работает на Linux и MacOS, но на Windows я получаю:
exportlib.obj: ошибка LNK2019: неразрешенный внешний символ «__declspec (dllimport) public: класс std :: vector> __cdecl Algorithmslib :: k_means (класс std :: vector> const &, без знака __int64, без знака __int64)» (__imp_) ? k_means @ Algorithmslib @@ QEAA? AV? $ vector @ VPoint @@ V? $ allocator @ VPoint @@@ std @@@ std @@ AEBV23 @ _K1 @ Z), на который ссылается функция "private: void __cdecl Exportlib :: setSuppPoints (void) "(? setSuppPoints @ Exportlib @@ AEAAXXZ)
debug \ exportlib.dll: фатальная ошибка LNK1120: 1 неразрешенный внешний код
У меня закончились идеи, что может вызвать ошибку (только в Windows!)
Общая библиотека с экспортированным классом:
// Project file for exported shared library
// algorithmslib.pro
DEFINES += ALGORITHMSLIB_LIBRARY
Экспорт или импорт в соответствии с определениями:
// algorithmslib_global.h
#if defined(ALGORITHMSLIB_LIBRARY)
# define ALGORITHMSLIBSHARED_EXPORT Q_DECL_EXPORT
#else
# define ALGORITHMSLIBSHARED_EXPORT Q_DECL_IMPORT
#endif
Объявление класса:
// algorithmslib.h
#include "algorithmslib_global.h"
class ALGORITHMSLIBSHARED_EXPORT Algorithmslib : public QObject
{
Q_OBJECT
public:
Algorithmslib();
std::vector<Point> k_means(const std::vector<Point>& data,
size_t k,
size_t number_of_iterations);
};
Вызов k_means
метода экспортированного класса из другой общей библиотеки:
// This is a second shared library which calls the exported class of the 1st shared library
// exportlib.cpp
#include "algorithmslib.h"
void Exportlib::setSuppPoints()
{
Algorithmslib algorithmEngine;
std::vector<Point> means = algorithmEngine.k_means(data, k, number_of_iterations);
}
Я компилирую с помощью Desktop_Qt_5_12_1_MSVC2017_64bit-Debug Kit:
Я переименовал разделяемую библиотеку во что-то очень уникальное, и все же выдается та же ошибка компоновщика. Поэтому эта проблема НЕ является моим случаем