尝试用 C++ 创建库。测试项目找不到已声明构造函数的实现?
Trying to create Library in C++. Test project can't find implementation of declared constructor?
我正在学习 C++,但在尝试创建库时遇到瓶颈。使用 Visual Studio 2013,我收到此错误:
Error 1 error LNK2019: unresolved external symbol "public: __thiscall Polynomial::Polynomial(void)" (??0Polynomial@@QAE@XZ) referenced in function _main A:\Medier\Desktop\PolyLib\Test\Test.obj Test
测试项目目前缩减为:
#include "A:\Medier\Desktop\PolyLib\PolyLib\PolyLib.h"
using namespace std;
void main()
{
Polynomial poly;
}
库头文件,PolyLib.h
,如下所示:
using namespace std;
class Polynomial {
private:
double* Coefficients; //Array of coefficients - Pointer type.
int Degree; //The highest exponent of the polynomial
public:
Polynomial(); //Default constructor - Creates the trivial polynomial 0.
Polynomial(int degree, double coefficients[]); //Constructor for specific polynomials
库中终于有一个 CPP 文件,PolyLib.cpp
,提供头文件的实现。看起来像这样:
#include "PolyLib.h"
using namespace std;
Polynomial::Polynomial() {
Degree = 0;
Coefficients = new double[Degree + 1];
Coefficients[0] = 0;
}
Polynomial::Polynomial(int degree, double coefficients[]) : Degree(degree), Coefficients(coefficients) {
int i = 0;
}
我知道我的测试项目查看 PolyLib.h
文件以查看可用的内容。我理解错误说它找不到多项式的空构造函数的实际实现。因此,我得出结论,PolyLib.cpp
文件未被使用。
谁能告诉我从这里到哪里去?
如果您尝试将 Polylib.h
和 Polylib.cpp
构建为二进制文件,例如 Polylib.lib
,那么您需要一个单独的项目来包含这些源文件并构建一个静态库.然后你需要你的项目 link 这个 Polylib
库,这样它就可以 link 代码到你的二进制文件中。如果您只想拥有一个项目并且只构建一个二进制文件,那么您需要将 Polylib.h
和 Polylib.cpp
源移动到您的项目中并一起构建它们。另一件事是使用绝对路径来包含 headers 是一个坏主意。您想要使用相对路径包含 headers,然后使用项目设置告诉它 headers 所在的位置。例如,如果它在项目本地,则使用 #include "header"
。如果它不在项目本地,则使用 #include <libraryfolder/header>
然后告诉项目库文件夹在 "include directories setting".
中的位置
可以将所有 .cpps 构建到一个项目中,这对于初学者来说是最常见的。但是,根据问题标签和措辞,我假设您想创建 link 一个静态库,这也可以相当简单地完成。
为了解释这个问题,我刚刚在一个 VS2013 项目中构建了一个正确设置静态库 + exe linking 的示例:Dropbox link。
基础是你需要两个项目:一个lib项目(输出一个静态.lib文件)和一个exe项目(输出一个.exe文件)。 .exe 项目包含一个 main()
函数,并且能够将 header 和 link 包含到 .lib.
MyExe 的有趣之处在于我在包含路径中添加了 $(SolutionDir)\LibExample\Inc
以包含我的 header (header.h),并且我添加了 $(SolutionDir)$(Configuration)
到库的 lib 路径。您可以通过右键单击项目找到这些,转到属性,它们都在 "VC++ Directories".
下
关于确定查找您的库所需的路径的一个重要提示是简单地构建库。它实际上会在 "Output->Build" 文本中告诉您刚刚构建的文件所在的位置。这是您需要的路径。 $(SolutionDir)$(Configuration)
就是这个路径的"macro"shorthand。我建议使用宏,这样您就可以轻松地将项目目录移动到另一个路径或计算机。
我还在 linker\input 设置中将 LibExample.lib;
添加到 "additional dependencies"。这是能够 link 库的关键步骤。不这样做会导致无法解析的外部符号,就像您看到的那样。
我还在 MyExe 和 LibExample 之间设置了依赖关系(右键单击项目,Build Dependencies->Project Dependencies)。这很重要,因此您可以重建整个解决方案而不用担心 linking 到旧版本的库。有了适当的依赖关系,它总是首先构建库,然后是 exe。
我正在学习 C++,但在尝试创建库时遇到瓶颈。使用 Visual Studio 2013,我收到此错误:
Error 1 error LNK2019: unresolved external symbol "public: __thiscall Polynomial::Polynomial(void)" (??0Polynomial@@QAE@XZ) referenced in function _main A:\Medier\Desktop\PolyLib\Test\Test.obj Test
测试项目目前缩减为:
#include "A:\Medier\Desktop\PolyLib\PolyLib\PolyLib.h"
using namespace std;
void main()
{
Polynomial poly;
}
库头文件,PolyLib.h
,如下所示:
using namespace std;
class Polynomial {
private:
double* Coefficients; //Array of coefficients - Pointer type.
int Degree; //The highest exponent of the polynomial
public:
Polynomial(); //Default constructor - Creates the trivial polynomial 0.
Polynomial(int degree, double coefficients[]); //Constructor for specific polynomials
库中终于有一个 CPP 文件,PolyLib.cpp
,提供头文件的实现。看起来像这样:
#include "PolyLib.h"
using namespace std;
Polynomial::Polynomial() {
Degree = 0;
Coefficients = new double[Degree + 1];
Coefficients[0] = 0;
}
Polynomial::Polynomial(int degree, double coefficients[]) : Degree(degree), Coefficients(coefficients) {
int i = 0;
}
我知道我的测试项目查看 PolyLib.h
文件以查看可用的内容。我理解错误说它找不到多项式的空构造函数的实际实现。因此,我得出结论,PolyLib.cpp
文件未被使用。
谁能告诉我从这里到哪里去?
如果您尝试将 Polylib.h
和 Polylib.cpp
构建为二进制文件,例如 Polylib.lib
,那么您需要一个单独的项目来包含这些源文件并构建一个静态库.然后你需要你的项目 link 这个 Polylib
库,这样它就可以 link 代码到你的二进制文件中。如果您只想拥有一个项目并且只构建一个二进制文件,那么您需要将 Polylib.h
和 Polylib.cpp
源移动到您的项目中并一起构建它们。另一件事是使用绝对路径来包含 headers 是一个坏主意。您想要使用相对路径包含 headers,然后使用项目设置告诉它 headers 所在的位置。例如,如果它在项目本地,则使用 #include "header"
。如果它不在项目本地,则使用 #include <libraryfolder/header>
然后告诉项目库文件夹在 "include directories setting".
可以将所有 .cpps 构建到一个项目中,这对于初学者来说是最常见的。但是,根据问题标签和措辞,我假设您想创建 link 一个静态库,这也可以相当简单地完成。
为了解释这个问题,我刚刚在一个 VS2013 项目中构建了一个正确设置静态库 + exe linking 的示例:Dropbox link。
基础是你需要两个项目:一个lib项目(输出一个静态.lib文件)和一个exe项目(输出一个.exe文件)。 .exe 项目包含一个 main()
函数,并且能够将 header 和 link 包含到 .lib.
MyExe 的有趣之处在于我在包含路径中添加了 $(SolutionDir)\LibExample\Inc
以包含我的 header (header.h),并且我添加了 $(SolutionDir)$(Configuration)
到库的 lib 路径。您可以通过右键单击项目找到这些,转到属性,它们都在 "VC++ Directories".
关于确定查找您的库所需的路径的一个重要提示是简单地构建库。它实际上会在 "Output->Build" 文本中告诉您刚刚构建的文件所在的位置。这是您需要的路径。 $(SolutionDir)$(Configuration)
就是这个路径的"macro"shorthand。我建议使用宏,这样您就可以轻松地将项目目录移动到另一个路径或计算机。
我还在 linker\input 设置中将 LibExample.lib;
添加到 "additional dependencies"。这是能够 link 库的关键步骤。不这样做会导致无法解析的外部符号,就像您看到的那样。
我还在 MyExe 和 LibExample 之间设置了依赖关系(右键单击项目,Build Dependencies->Project Dependencies)。这很重要,因此您可以重建整个解决方案而不用担心 linking 到旧版本的库。有了适当的依赖关系,它总是首先构建库,然后是 exe。