在多个项目中包含一个类

visual studio 2010 - C++ Include a class in multiple projects

本文关键字:包含一 项目      更新时间:2023-10-16

我想让一个类包含到我的所有项目中,这样当我做一个更改时,它会从该文件的副本更新所有项目。

例如:

foo。

class foo
{
public:
    foo();
};
extern Foo* pFoo;

foo.cpp

Foo* pFoo;

foo::foo()
{
    printf("Foon");
}

main.cpp

#include "foo.h"
int main(int argc, char* argv[])
{
    pFoo = new Foo();
    return 0;
}

我怎么能包括"foo.h"到多个项目干净,没有任何麻烦?

首先,你不能只在多个项目中包含头文件;项目最终也必须与实施相联系。

有很多方法可以做到这一点;这取决于你想如何工作以及你的工具是什么。

  1. 例如,如果你正在(你应该)使用源代码控制,一些源代码控制系统将允许你在项目之间共享文件(svn有外部文件,StarTeam有共享文件....)。如果你这样做,每个项目将收到一个文件的副本,当你签出它,你可以正常构建它作为项目的一部分。

  2. 另一个选择是创建一个库。一旦你选择了这个选项,你必须做出另一个选择——静态库(.lib)或动态库(.dll)。

两者都有优点和缺点。

2.。静态链接似乎"更简单",满足了您的基本需求——只需将这个类编译到您的项目中。然而,静态链接有其局限性。如果你用不同的选项/设置构建你的静态库,而不是你链接到的项目,它可能无法工作。如果您为所有项目(或其特定子集)制定了使用特定选项集的策略,那么这对您来说就不是问题。

要创建静态库,需要创建静态库类型的visual studio项目。当它构建时,它将运行图书管理员而不是链接器。

2. b。DLL解决了(大部分)不同编译器选项的问题(有一些事情会影响使用DLL,比如结构打包)。同样,你在Visual Studio中创建一个DLL类型的项目,它会为你构建DLL。

然后,再一次,你必须做出选择。当您将DLL链接到可执行文件时,您必须选择动态链接或静态链接。要静态链接,您需要在项目中包含一个.lib文件——它应该是与DLL一起创建的。如果您链接到这个.lib,那么程序将在打开时查找并(尝试)加载DLL。

最灵活、最复杂的方法是动态链接。要做到这一点,您必须在代码中加载DLL并创建指向其中您想要使用的任何函数的指针。作为您所描述的问题的解决方案,这可能有些矫枉过正,而且我不确定您将如何访问类(而不是函数)。

无论如何使用DLL,您都必须将其与程序一起分发,并确保程序可以访问它(在与可执行文件相同的文件中,在Windows DLL搜索路径中,或者,在动态加载的情况下,您可以具体指定路径,然后确保将DLL安装到特定位置)。

如果你能管理一个静态库(2.a),它就能解决你所要求的问题,因为一个静态库基本上是间接地在你的项目中包含类——它是你的代码的编译版本,准备链接。

即使你创建了一个库或dll,你也必须在源代码控制中确定如何将其包含在不同的项目中。

单例呢?

class foo
{
    foo()
    {
        printf("foon") ;
    }
public:
    static foo &make(void)
    {
        static foo the_instance ;
        return the_istance ;
    }
};

这样你只有一个实例(这是你想要的吗),并且你确定它是在哪里创建的(这就是为什么constructore被声明为private)。

现在,您可以在一个头文件中包含整个类,而无需进一步的需要。