Linux和macOS都可以,但是Windows构建会引发链接器错误LNK2019

时间:2019-04-29 06:52:56

标签: c++ qt linker linker-errors

我正在从另一个共享库中调用共享库中的类方法。应用程序在Linux和macOS上运行良好,但在Windows上却收到:

  

exportlib.obj:错误LNK2019:未解析的外部符号“ __declspec(dllimport)公共:类std :: vector> __cdecl Algorithmslib :: k_means(class std :: vector> const&,unsigned __int64,unsigned __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工具包进行编译:

Compilers


我将共享库重命名为非常独特的名称,但是引发了相同的链接器错误。因此,this issue不是我的情况

1 个答案:

答案 0 :(得分:0)

第一个共享库

我在第一个共享库中有一个struct

// 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);

修复

我将第二个共享库的标题从class Point;更改为struct Point;,并且解决了Windows上的链接器错误:

// exportlib.h

struct Point; // declared in algorithmslib.h as "struct" NOT "class"