在Visual C ++中将静态库链接到新项目
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Visual C ++中将静态库链接到新项目相关的知识,希望对你有一定的参考价值。
我刚开始学习C ++并使用Visual Studio 2017作为IDE。我想尽可能远离CLR,甚至Windows特定代码。每个新项目选项似乎都说'Windows',因此建议Windows操作系统依赖项,除了常规>空项目,这是我选择的选项。
我正在尝试编写一个带有一些函数的静态库。这是我正在尝试做的一个简单的例子。
//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文件ok ?)。
我尝试在项目B属性> C / C ++>常规>其他#using目录中添加项目A文件夹的路径(同时到Project文件夹和Debug文件夹,我希望生成Lib1.lib文件),但这没效果。
有人可以指出我做错了什么,这让我难倒了几个小时了。
谢谢。
当您在#include
.h文件中时,通常只是在代码中包含声明(例外情况适用,但在这种情况下不适用)。它们与放在.cpp文件中的定义是分开的。
默认情况下,您的项目不会自动相互共享任何此类信息。例如,您的定义或项目A的声明不会神奇地传播到项目B.
但正如您在此处所做的那样,您可以通过#include
ing头文件将项目A中的声明引用到项目B.然而,这些只是声明!他们只是解释了函数的存在但没有实现它 - 你需要将你的Add
函数的定义添加到Project B.
将这些定义结合在一起的过程称为链接。您需要将项目A的定义(更准确地说是.lib)链接到项目B.您执行此操作的方式随着每个版本的Visual Studio略有改变,但它通常在某些“链接器选项”和一些“依赖关系”下标签/窗口。
.lib文件通常位于解决方案目录下,而不是更具体的项目目录:查找或可能\。
以上是关于在Visual C ++中将静态库链接到新项目的主要内容,如果未能解决你的问题,请参考以下文章
在Visual Studio 2010中将Native / C ++ DLL链接到托管C ++ / CLI包装器
在 Windows 中将 VS2005 静态库与 gcc 链接