将静态库链接到 Visual C++ 中的新项目
Linking a static library to a new project in Visual C++
我刚开始学习 C++ 并使用 Visual Studio 2017 作为 IDE。我想尽可能远离 CLR,甚至 Windows 特定代码。每个新项目选项似乎都说 'Windows',因此建议 Windows OS 依赖项,除了 General > Empty Project,所以这是我选择的选项。
我正在尝试编写一个带有一些函数的静态库。这是我正在尝试做的一个简单示例。
//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 编译时没有 warning/error。我将 Project Properties > General > Configuration Type 更改为 Static Library (.lib),但实际上我在项目目录中找不到编译后的 .lib 文件,只有一个 .obj 文件。
当我尝试构建项目 B 时,它抛出以下错误消息。
"LNK2019 unresolved external symbol "double __cdecl FrameTransformations::Add(double,double)" (?Add@FrameTransformations@@YANNN@Z) 在函数_main FrameTransformationTests S:\Projects\Cpp\Code\FrameTransformations\FrameTransformationTests\Main 中引用.obj 1
我看了一下,项目B好像找不到项目A的Add函数,虽然我通过Intellisense自动完成了函数和参数(这是不是因为它可以找到Lib1.h 文件好吗?)。
我尝试在项目 B 属性 > C/C++ > 常规 > 附加#using 目录中添加项目 A 文件夹的路径(同时添加到项目文件夹和我所在的调试文件夹预计会生成 Lib1.lib 文件),但这没有用。
谁能指出我做错了什么,这让我困惑了几个小时。
谢谢。
当您 #include
一个 .h 文件时,您通常只是将 声明 包含到您的代码中(例外情况适用,但在这种情况下不适用)。这些与放置在 .cpp 文件中的 定义 是分开的。
默认情况下,您的项目不会自动相互共享任何此信息。例如,您在项目 A 中的定义或声明不会神奇地传播到项目 B。
但是正如您在此处所做的那样,您可以通过 #include
ing 头文件将项目 A 中的声明引用到项目 B 中。然而,这些只是声明!他们只是解释了函数的存在但没有实现它——您需要将 Add
函数的定义添加到项目 B.
将这些定义组合在一起的过程称为 linking。 您需要 link 项目 A 的定义(.lib,更多精确地)到项目 B。你这样做的方式随着 Visual Studio 的每个版本而略有不同,但它通常在一些 "Linker Options" 和一些 "Dependencies" tab/window.
.lib 文件通常在解决方案目录下,而不是更具体的项目目录下:
在 \ 或可能的 \\.
中查找
您需要将项目 A 的引用添加到项目 B-> 项目属性中,如下所示,
此外,您需要在下面添加参考
我刚开始学习 C++ 并使用 Visual Studio 2017 作为 IDE。我想尽可能远离 CLR,甚至 Windows 特定代码。每个新项目选项似乎都说 'Windows',因此建议 Windows OS 依赖项,除了 General > Empty Project,所以这是我选择的选项。
我正在尝试编写一个带有一些函数的静态库。这是我正在尝试做的一个简单示例。
//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 编译时没有 warning/error。我将 Project Properties > General > Configuration Type 更改为 Static Library (.lib),但实际上我在项目目录中找不到编译后的 .lib 文件,只有一个 .obj 文件。
当我尝试构建项目 B 时,它抛出以下错误消息。
"LNK2019 unresolved external symbol "double __cdecl FrameTransformations::Add(double,double)" (?Add@FrameTransformations@@YANNN@Z) 在函数_main FrameTransformationTests S:\Projects\Cpp\Code\FrameTransformations\FrameTransformationTests\Main 中引用.obj 1
我看了一下,项目B好像找不到项目A的Add函数,虽然我通过Intellisense自动完成了函数和参数(这是不是因为它可以找到Lib1.h 文件好吗?)。
我尝试在项目 B 属性 > C/C++ > 常规 > 附加#using 目录中添加项目 A 文件夹的路径(同时添加到项目文件夹和我所在的调试文件夹预计会生成 Lib1.lib 文件),但这没有用。
谁能指出我做错了什么,这让我困惑了几个小时。
谢谢。
当您 #include
一个 .h 文件时,您通常只是将 声明 包含到您的代码中(例外情况适用,但在这种情况下不适用)。这些与放置在 .cpp 文件中的 定义 是分开的。
默认情况下,您的项目不会自动相互共享任何此信息。例如,您在项目 A 中的定义或声明不会神奇地传播到项目 B。
但是正如您在此处所做的那样,您可以通过 #include
ing 头文件将项目 A 中的声明引用到项目 B 中。然而,这些只是声明!他们只是解释了函数的存在但没有实现它——您需要将 Add
函数的定义添加到项目 B.
将这些定义组合在一起的过程称为 linking。 您需要 link 项目 A 的定义(.lib,更多精确地)到项目 B。你这样做的方式随着 Visual Studio 的每个版本而略有不同,但它通常在一些 "Linker Options" 和一些 "Dependencies" tab/window.
.lib 文件通常在解决方案目录下,而不是更具体的项目目录下: 在 \ 或可能的 \\.
中查找您需要将项目 A 的引用添加到项目 B-> 项目属性中,如下所示,
此外,您需要在下面添加参考