Linux и macOS в порядке, но сборка Windows выдает ошибку компоновщика LNK2019 - PullRequest
0 голосов
/ 29 апреля 2019

Я вызываю метод класса в общей библиотеке из другой общей библиотеки. Приложение прекрасно работает на 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:

Compilers


Я переименовал разделяемую библиотеку во что-то очень уникальное, и все же выдается та же ошибка компоновщика. Поэтому эта проблема НЕ является моим случаем

1 Ответ

0 голосов
/ 30 апреля 2019

Первая общая библиотека

У меня есть struct внутри 1-й общей библиотеки:

// algorithmslib.h

struct Point {
    float x{0}, y{0}, z{0};
};

Вторая общая библиотека

Я использовал выше struct внутримоя вторая общая библиотека выглядит следующим образом:

заголовок:

// exportlib.h

class Point; // Note that I was using "class" here 
             // but the declaration inside algorithmslib.h is "struct"

size_t computeNumberOfClusters(const std::vector<Point> &data);

источник:

//exportlib.cpp

#include "algorithmslib.h"

std::vector<Point> data(number_of_points); // Point structure is declared in algorithmslib.h

size_t k = computeNumberOfClusters(data);
size_t number_of_iterations = 300;
Algorithmslib algorithmEngine;

std::vector<Point> means = algorithmEngine.k_means(data, k, number_of_iterations);

Fix

Я изменил заголовок для 2-й общей библиотекиот class Point; до struct Point; и ошибка компоновщика в Windows была устранена:

// exportlib.h

struct Point; // declared in algorithmslib.h as "struct" NOT "class"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...