我想让一个类包含在我的所有项目中,这样当我进行更改时,它会更新该文件副本中的所有项目。
例如:
foo.h中
class foo
{
public:
foo();
};
extern Foo* pFoo;
Foo.cpp中
Foo* pFoo;
foo::foo()
{
printf("Foo\n");
}
的main.cpp
#include "foo.h"
int main(int argc, char* argv[])
{
pFoo = new Foo();
return 0;
}
如何干净地将“foo.h”包含在多个项目中而不会有任何麻烦?
答案 0 :(得分:0)
首先,您不能只在多个项目中包含头文件;这些项目最终也必须与实施相关联。
有很多方法可以做到这一点;这取决于你想要的工作方式以及你的工具。
例如,如果你(并且你应该)使用源代码控制,一些源代码控制系统将允许你在项目之间共享文件(svn有外部文件,StarTeam有共享文件...... )。如果你这样做,每个项目在你检查时都会收到一份文件的副本,你可以在项目中正常构建它。
另一个选择是创建一个库。一旦选择了该选项,就必须做出另一种选择 - 静态库(.lib)或动态(.dll)。
两者都有优点和缺点。
2.A。静态链接似乎更简单"并在此处回答您的基本需求 - 只需将此类编译到您的项目中。但是,静态链接有局限性。如果使用与将其链接到的项目不同的选项/设置构建静态库,则可能无效。如果您的所有项目(或其某个子集)的策略使用某组选项,那么这对您来说不是问题。
要创建静态库,请创建静态库类型的visual studio项目。在构建时,它将运行图书管理员而不是运行链接器。
2.b中。 DLL解决(大多数)不同编译器选项的问题(有一些因素可能影响DLL的使用,例如结构打包)。再次,您在Visual Studio的DLL类型中创建一个项目,它将为您构建DLL。
然后,再次,你必须做出选择。将DLL链接到可执行文件时,必须选择动态或静态链接。要静态链接,在项目中包含一个.lib文件 - 它应该是用你的DLL创建的。如果你链接到这个.lib,程序将在它打开时查找并(尝试)加载它。
最灵活,最复杂的方法是动态链接。为此,在您的代码中,您必须加载DLL并创建指向其中要使用的任何函数的指针。这可能是你所描述的问题的解决方案,并且我不确定如何访问类(而不是函数)。
无论使用DLL的哪种方式,都必须将其与程序一起分发,并确保程序可以访问它(与可执行文件在同一文件中,在Windows DLL搜索路径中,或者,在本例中)在动态加载时,您可以专门指定路径,然后确保将DLL安装到该特定位置。)
如果你可以管理一个静态库(2.a),它可以解决你提出的问题,因为静态库基本上是间接包含你项目中的类 - 它是你的代码的编译版本联。
即使您创建了lib或dll,也必须在源代码控制中解决如何将其包含在不同项目中的问题。
答案 1 :(得分:-1)
单身人士怎么样?
class foo
{
foo()
{
printf("foo\n") ;
}
public:
static foo &make(void)
{
static foo the_instance ;
return the_istance ;
}
};
这样你只有一个实例(这就是你想要的),你确定它在哪里&#39 ; s创建(这就是为什么constructore被声明为私有)。
现在,您可以将单个头文件中的整个cvlass包含在项目中,而无需进一步的需求。