关于如何在 C++ 中处理不同项目中的文件所需的课程

Posted

技术标签:

【中文标题】关于如何在 C++ 中处理不同项目中的文件所需的课程【英文标题】:Lesson needed on how to work with files in different projects in C++ 【发布时间】:2012-06-08 18:46:38 【问题描述】:

我已经能够在同一个项目中工作一段时间了,编写并成功运行了 c++ 代码。但是,我发现我仍然缺少一些关于如何将我的 .h 文件导出到另一个项目并在那里成功使用它们的要点。

我创建了第二个项目 project B 来测试我在 project A 中的类。 visual c++: #include files from other projects in the same solution 我将Project A 中的头文件路径添加到Project B 的项目配置中的 Additional Include Directories(C\C++>general and Linker>general) 部分。我尝试按照此页面上的教程http://msdn.microsoft.com/en-us/library/ms235636.aspx 进行操作,但仍然出现以下错误

** 链接:致命错误 LNK1104:无法打开文件 'C:\Users\LaC\Projects\OSGB\Debug\OSGB.lib**

如果能帮助我准确理解这是如何完成的,我将不胜感激,以便将来当我遇到此问题时,我可以知道如何进行故障排除。

下面的代码就是我正在使用的所有代码。

IN PROJECT A
=============

//Utility.h
class Utility

    private:

    protected:

    public:
        Utility(void);
        ~Utility(void);
        double square_root (const double);
;

//Utility.cpp

    #include "StdAfx.h"
    #include "Utility.h"
    
    
    Utility::Utility(void)
    
        //do nothing for now
    
    
    
    Utility::~Utility(void)
    
        //do nothing for now
    
    
    double Utility::square_root (const double)
    
        return 0;
    
    

IN PROJECT B
===============

#include "gtest/gtest.h"
#include "Utility.h"

TEST (SquareRootTest, PositiveNos)  

    Utility u; 
    EXPECT_EQ (50.3321, u.square_root (2533.310224));

【问题讨论】:

快速更新帖子以反映新错误。 【参考方案1】:

有两种(通用)方法可以将文件包含到您的项目中:

让它们成为您项目的一部分(从解决方案资源管理器中添加它们)或 将它们作为库导入(静态或动态链接)

如果您将它们作为项目的一部分,那么您必须添加头文件和源文件才能正确编译项目。但是,这通常不是您想要做的,因为它违背了拥有外部库的目的。

第二种情况是使用外部库,这需要你:

在您的 C++ 属性中包含由库导出的头文件。 对于静态链接:您还必须在链接器属性中包含 *.lib 文件(构建库的输出)。

动态链接:see tutorial.

请记住:构建 C++ 项目有两个部分 - 编译链接

编译器错误: 如果您收到代码以 C* 开头的错误(例如 C1083)并且与文件的问题标头有关,请检查 Properties-> C/C++ -> General -> Additional Include Directories。

链接器错误: 如果遇到代码以LNK* 开头的错误,请检查

属性 -> 链接器 -> 常规 -> 附加库目录(确保这指向 *.lib 文件所在的位置)AND 属性 -> 链接器 -> 输入 -> 附加依赖项(确保在此处添加 *.lib 文件)。

如果您是动态链接,请检查您是否正确引用了 DLL。


因此,在您的情况下,您必须确定是静态链接还是动态链接,然后进行适当的引用。 那么你是从动态库还是静态库中获取这些头文件的?

【讨论】:

我试图在同一个项目中同时做这两个。我首先构建了谷歌测试文件并添加了静态库文件,并且构建正确。我尝试在同一个解决方案文件中从另一个项目链接到 *.dll。这就是我被困在这一点上的地方。错误消息似乎指向导入 *.lib 文件的一些问题,只是我没有该项目的 *.lib 文件 我假设在尝试进行动态链接时,我使用 *.dll 文件,而对于静态链接,我使用 *.lib 文件。错误是 LINK:致命错误 LNK1104:无法打开文件 'C:\Users\LaC\Projects\OSGB\Debug\OSGB.lib'【参考方案2】:

当链接器为存在于另一个库(DLL 或共享库)中的符号发出 unresolved external symbol 时,这表明您需要将您的应用链接到该其他库的 .lib 文件。这很可能就是这里发生的事情。

欲了解更多信息,请参阅:

(MSDN) Walkthrough: Creating and Using a Dynamic Link Library (C++)

【讨论】:

感谢您的链接。我通读并按照该列表中的步骤进行操作。但我似乎还有一个链接器问题要处理。新错误是 >LINK:致命错误 LNK1104:无法打开文件“C:\Users\LaC\Projects\OSGB\Debug\OSGB.lib”。我在调试文件夹中没有看到 .lib 文件 有人能帮忙吗?我已经为此努力了好几个小时了。

以上是关于关于如何在 C++ 中处理不同项目中的文件所需的课程的主要内容,如果未能解决你的问题,请参考以下文章

如何从 OpenCV C++ 中的 HoughLines 函数输出中绘制所需的线?

如何安装在 windowsservercore Docker 映像上执行本机 C++ DLL/EXE 所需的所有依赖二进制文件

maven (profiles)装载不同环境所需的配置文件

Ruby 如何知道在哪里可以找到所需的文件?

在哪里放置以及如何在 c++ 项目中包含 dll 文件?

Eclipse 中的 Java 项目:无法解析 java.lang.Object 类型。它是从所需的 .class 文件中间接引用的