链接我自己的静态库时,无法解析的外部符号

Unresolved external symbol when linking my own static library

本文关键字:符号 外部 自己的 我自己 静态 链接      更新时间:2023-10-16

当我试图将自己的库链接到我的项目时,出现这些错误:

.main.cpp(10) : warning C4091: 'extern ' : ignored on left of 'Hamster' when no variable is declared
main.obj : error LNK2001: unresolved external symbol "public: void __thiscall Hamster::SetHealth(int)" (?SetHealth@Hamster@@QAEXH@Z)
我完全不知道该做什么。我一直在网上寻找解决方案,但没有结果。

(使用Visual Studio c++, MS Windows XP编译)

静态库的源代码:

struct Hamster
{
public:
    int Health;
    void SetHealth(int newHealth)
    {
        if(newHealth <= 100 && newHealth > 0)
        this->Health = newHealth;
    }
};

控制台程序源代码

#include <iostream>
using namespace std;
#pragma comment(lib, "../Release/mylib.lib")
extern struct Hamster
{
public:
    int Health;
    void SetHealth(int newHealth);
};
void main()
{
    Hamster White;
    White.SetHealth(100);
    cout << White.Health << endl;
}

你能看一下并解释一下是什么问题吗?

在两个cpp文件中定义Hamster,但不同;这是不允许的。("一个定义规则"是这么说的)

你需要做的是将struct Hamster的定义移动到一个头文件中,并将该头文件包含在main.cpp和另一个。cpp文件

(如果您保留SetHealth的定义,则实际上不需要另一个.cpp文件—或者实际上不需要静态库。通过在类中定义函数,可以使其内联。对于更复杂的函数,通常从类定义中省略函数的定义,而将其包含在一个.cpp文件中。

您可能希望将函数声明移出struct,以便它不是"内联"函数。

如果你真的想要一个库和一个使用你的库的可执行文件,你必须在visual studio中创建两个项目。

第一个构建静态库,第二个构建可执行文件。构建可执行文件的项目必须依赖于库。

此外,在头文件中声明结构并将其包含在main.cpp

相关文章: