我正在另一个共享库中的共享库中调用类方法。应用程序在Linux和macOS上构建良好但在Windows上我收到:
exportlib.obj:错误LNK2019:未解析的外部符号“__declspec(dllimport)public:class 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
method of exported class from within another shared library:// 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工具包进行编译:
我将共享库重命名为非常独特的东西,但是抛出了相同的链接器错误。因此,this issue不是我的情况
我在第一个共享库中有一个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"