尝试用 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.hPolylib.cpp 构建为二进制文件,例如 Polylib.lib,那么您需要一个单独的项目来包含这些源文件并构建一个静态库.然后你需要你的项目 link 这个 Polylib 库,这样它就可以 link 代码到你的二进制文件中。如果您只想拥有一个项目并且只构建一个二进制文件,那么您需要将 Polylib.hPolylib.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。