我的Visual Studio C ++解决方案中有两个项目,我想在它们之间共享一些代码。因此,我寻找了它,发现很多人建议创建静态库并将其与两个项目链接。但是,当我这样做时,所有静态变量都出现“无法解析的外部符号”错误。这里是如何重现该问题的方法:
1)使用名为Project1的空项目创建空的Visual Studio解决方案,将其类型更改为“静态库”(lib)。添加Foo类:
Foo.h:
#pragma once
class Foo
{
public:
static int F(int a);
private:
static int bar;
};
Foo.cpp:
#include "Foo.h"
int Foo::F(int a)
{
bar = 3;
return a*bar;
}
2)创建一个名为Project2的空项目。
Source.cpp:
#include <iostream>
#include "Foo.h"
int main()
{
std::cout << Foo::F(2) << std::endl;
std::cin.get();
return 0;
}
3)在Project2的属性中,将Project1文件夹添加到“其他包含目录”
4)在Project2的通用属性中,单击“添加新引用”,将Project1添加为新引用。(或者您可以在Linker-> Input-> Additional Dependencies中添加Project1.lib)。
现在,仅编译静态库(Project1)时,它可以工作。当您同时编译或仅编译可执行文件(Project2)时,
2>Project1.lib(Foo.obj) : error LNK2001: unresolved external symbol "private: static int Foo::bar" (?bar@Foo@@0HA)
2>C:\dev\Project1\Debug\Project2.exe : fatal error LNK1120: 1 unresolved externals
如果删除静态变量,它将起作用。我究竟做错了什么?有什么更好的方法和简单的方法可以在项目之间共享代码(而不仅仅是在两个项目中都包含相同的.cpp / .h文件)?
您已经声明了bar
,Foo
但尚未提供定义。您需要在代码中添加以下内容。
int Foo::bar;
如果您想使用特定值对其进行初始化(例如42),则可以执行
int Foo::bar = 42;
您仅收到链接器错误的原因Project1
是因为静态库或Project2
实际库都无法访问, Foo::bar
因此没有链接器可解决的引用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句