我目前正在尝试解决Visual Studio 2015中的链接器错误并暂时处理它并且我不知道如何成功。
我在VS 2015中有一个ProjectFolder,有两个项目:
项目1:
其他包含目录设置为:.\trunk\
我的.h和.cpp文件位于.\trunk\
目录中,其中包含多个子目录.\trunk\FooModule\
,.\trunk\FooDefinitions\
.\trunk\FooModule\
包含:
foo.h中
class Foo {
private:
double x;
public:
Foo();
double getX();
double getPI();
}
Foo.cpp中
#include "Foo.h"
#include <FooDefinitions\FooDefinitions.h>
Foo::Foo() : x(0.) {
}
double Foo::getX() {
return x;
}
double Foo::getPI() {
return PI;
}
.\trunk\FooDefinitions\
包含:
FooDefinitions.h
#define PI 3.141;
project1
将代码导出到库Foo.lib
到.\lib\
文件夹。
Foo.cpp
可以包含Foo.h
,因为这些文件位于同一文件夹中。 Foo.cpp
还可以包含FooDefinitions.h
,因为<...>
查看其他包含目录,找到给定的子文件夹FooDefinitions
,并在那里找到请求的.h
文件。一切都在编译,我得到一个.lib
文件,一切都很完美。
现在 project2 想要使用project1的源代码和.lib
文件。明确project2
应该执行稍后的单元测试,因此.lib
是必需的。
因此,在project2
设置中,设置如下(右键单击projectname - &gt; properties - &gt;配置属性):
- &GT;链接器 - &gt;一般 - &gt;其他图书馆模式:.\lib\
- &GT;链接器 - &gt;输入 - &gt;其他依赖项:Foo.lib
- &GT; VC ++ - 目录 - &gt;包含目录:.\trunk\
project2只包含一个带有main的.cpp
文件
TEST.CPP
#include <FooModule\Foo.h>
#include <iostream>
int main {
Foo f();
double y = f.getX();
std::cout << y;
return 0;
}
如果我现在要编译project2
,我会收到错误:
LNK2019 Foo.lib第1行,未解析的外部符号引用“bool __cdecl ...”
以及其他一些链接器错误,例如LNK2011
和LNK1120
。
我不明白这一点是因为:我给编译器提供了.lib
文件和使用过的类的头文件,编译器无法创建Foo
对象f
。此外,他无法在对象.getX()
上找到方法f
。
Visual Studio查找包含Foo.h
并显示Foo
颜色,如定义的类。因此我假设包含成功。
我可以通过将project2
的其他包含目录更改为.\trunk\FooModule\;.\trunk\FooDefinitions\
来解决此链接器错误。现在链接器能够找到符号。但是Foo.h
无法再找FooDefinitions.h
因为包含路径不再正确了。
子目录FooModule
和FooDefinitions
存在是有原因的,出于概述原因,#include <FooDefinitions\FooDefinitions.h>
应该是这样的。
所以我想这与子文件夹FooModule
和FooDefinitions
有关。但我喜欢我的subfodlers,我想保留它们。
我搞砸了什么链接器设置?我究竟做错了什么?什么可能解决这个问题?
提前谢谢。