2009-06-12 115 views
4

我有我要分发具有静态库包括的foo.c /小时,有人拾起,包括我在他们的应用程序静态库。静态库,链接和依赖

说,他们也有foo.c的/小时在他们的应用程序。他们是否有链接错误?

回答

7

源文件的名称在链接过程中并不重要。

如果文件具有相同的内容,那么你将有一个问题,假设.c文件包含导出的符号(例如非静态或非模板函数,或EXTERN变量)。

3

这取决于。如果foo.c和foo.h定义了相同的函数和/或变量,那么是的,会有多个定义错误。如果他们只有相同的文件名,但包含不同的代码,则不会有问题。

0

如果你给出你的静态库,你不需要包含foo.c,因为这将是lib的一部分,如果他们有自己的foo.c,它会混淆编译器和链接器,并可能导致问题,如果你们都有类似的功能,或者它会包含错误的标题。

你解决这个最好的方法是使用一个命名空间因而你的代码保持它的独特。

namespace myfooname 
{ 

void foo() 
{ 
//stuff 
} 


} 
2

链接的文件名
本身有问题最少的连接器,但有些IDE的会抱怨,如果文件被添加 - 即使他们是在不同的文件夹。但这通常不是什么大问题。

不要发布静态库(无源)

首先,你不应该独自重新分配一个静态库。代码和兼容性取决于编译器,许多常用设置,比如哪些运行时库(静态/动态,调试/释放,单线程已经从VC中解脱出来),一些C++设置,例如异常处理,虚拟成员函数指针表示等等。你最终需要构建数百种变体来支持主流编译器,而且你最终还是需要一些与之相似的人。

始终包括源,因此用户可以重建他的箱子静态库。或者使用动态库 - 但它有自己的陷阱。

命名空间
如所提到的,使用命名空间来避免冲突。不要过量,如果你有源代码,用户可以随时重新命名它。但请记住,using namespace声明不应出现在标题中,因此代码需要稍微调整。

+1

所有你提到静态库,造成问题的问题,也与任何编译的代码会导致问题的DLL,确实。 – 2009-06-12 07:49:08