在Visual C ++

时间:2018-02-28 21:30:17

标签: c++ static lnk2019

我刚开始学习C ++并使用Visual Studio 2017作为IDE。我想尽可能远离CLR,甚至Windows特定代码。每个新项目选项似乎都说“Windows'”,因此建议使用Windows操作系统依赖项,但General>除外。空项目,这是我选择的选项。

我正在尝试编写一个带有一些函数的静态库。这是我尝试做的一个简单例子。

//Lib1.h (Project A)
#pragma once
#ifndef LIB_H
namespace Lib1
{
    double Add(double, double);
}

//Lib1.cpp (Project A)
#include "Lib1.h"
namespace Lib1
{
    double Add(double a, double b)
    {
        return a + b;
    }
}

//Main.cpp (Project B)
#include "Lib1.h"

using namespace Lib1;

int main()
{
    double c = Add(1, 2);
}

项目A编译时没有警告/错误。我更改了项目属性>一般>配置类型为静态库(.lib),但我实际上无法在项目目录中找到已编译的.lib文件,只是一个.obj文件。

当我尝试构建项目B时,它会抛出以下错误消息。

" LNK2019未解析的外部符号" double __cdecl FrameTransformations :: Add(double,double)" (?添加@ FrameTransformations @@ YANNN @ Z)在函数_main中引用了FrameTransformationTests S:\ Projects \ Cpp \ Code \ FrameTransformations \ FrameTransformationTests \ Main.obj 1"

我看了一下,似乎项目B无法从项目A中找到Add函数,虽然我通过Intellisense得到函数和参数的自动完成(这只是因为它可以找到Lib1.h文件好吗?)。

我尝试在Project B Properties>中添加Project A文件夹的路径。 C / C ++>一般>额外的#using Directories(都在Project文件夹和Debug文件夹中我希望生成Lib1.lib文件),但是没有用。

有人可以指出我做错了什么,这让我感到难过了几个小时。

谢谢。

3 个答案:

答案 0 :(得分:3)

.lib文件通常位于解决方案目录下,而不是更具体的项目目录: 查看\或可能\\。

答案 1 :(得分:2)

当您#include .h文件时,通常只需在代码中包含声明(例外情况适用,但在这种情况下不适用)。它们与放置在.cpp文件中的定义是分开的。

默认情况下,您的项目不会自动共享此信息的任何。例如,您在项目A中的定义和声明并没有神奇地传播到项目B.

但是,正如您在此处所做的那样,您可以通过#include头文件将项目A中的声明引用到项目B.然而,这些只是声明!他们只解释函数的存在但不实现它 - 您需要将Add函数的定义添加到项目B中。

将这些定义结合在一起的过程称为链接。您需要将项目A的定义(更准确地说是.lib)链接到项目B.您执行此操作的方式随每个Visual Studio的版本略有不同,但它通常在某些"链接器选项"和一些"依赖"选项卡/窗口。

答案 2 :(得分:1)

您需要将Project A的引用添加到Project B-> Project Properties中,如下所示, enter image description here

此外,您需要在下面添加引用

enter image description here