使用源文件C ++

时间:2017-06-20 17:00:19

标签: c++ visual-studio visual-studio-2015 linker linker-errors

我目前正在尝试解决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 ...”

以及其他一些链接器错误,例如LNK2011LNK1120

我不明白这一点是因为:我给编译器提供了.lib文件和使用过的类的头文件,编译器无法创建Foo对象f。此外,他无法在对象.getX()上找到方法f。 Visual Studio查找包含Foo.h并显示Foo颜色,如定义的类。因此我假设包含成功。

我可以通过将project2的其他包含目录更改为.\trunk\FooModule\;.\trunk\FooDefinitions\来解决此链接器错误。现在链接器能够找到符号。但是Foo.h无法再找FooDefinitions.h因为包含路径不再正确了。 子目录FooModuleFooDefinitions存在是有原因的,出于概述原因,#include <FooDefinitions\FooDefinitions.h>应该是这样的。

所以我想这与子文件夹FooModuleFooDefinitions有关。但我喜欢我的subfodlers,我想保留它们。

我搞砸了什么链接器设置?我究竟做错了什么?什么可能解决这个问题?

提前谢谢。

0 个答案:

没有答案