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

标签 c++ static linker

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

.\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 文件中是正常的。)

关于c++ - 链接我自己的静态库时无法解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16386827/

相关文章:

c++ - 如何使用 boost::enable_if 定义部分特化模板类的成员函数

c++ - 从文件中捕获和转换字符串并执行数值运算

Java常量特定类体私有(private)变量访问

c - 带有 MinGW 的 Eclipse 没有正确链接

c++ - 使用命名空间不适用于定义?

c++ - 调用打开文件对话框后文件写入不起作用

java - 如何修复非静态错误

python - 使用 Flask 保护静态文件

c - 使用 make 将多个 .c 文件链接到一个程序中?

c++ - 链接器如何知道两个源文件中哪个是主文件,哪个包含函数定义?