我有一个我要分发的静态库,其中包含Foo.c / h,有人选择它并在其应用程序中包含我的静态库。
假设他们的应用程序中也有Foo.c / h。他们会有链接错误吗?
答案 0 :(得分:7)
源文件的名称在链接过程中并不重要。
如果文件具有相同的内容,那么假设.c文件包含导出的符号(例如非静态或非模板函数或外部变量),则会出现问题。
答案 1 :(得分:3)
这取决于。如果foo.c和foo.h定义了相同的函数和/或变量,那么肯定会有多个定义错误。如果它们只有相同的文件名,但包含不同的代码,则没有问题。
答案 2 :(得分:2)
链接文件名
链接器本身问题最少,但是如果添加了文件,某些IDE会抱怨 - 即使它们位于不同的文件夹中。但这通常不是什么大问题。
不要分发静态库(没有源代码)
首先,您不应单独重新分发静态库。代码 - 兼容性 - 取决于编译器,以及许多常见设置,例如哪些运行时库(静态/动态,调试/发布,很高兴单线程从VC中消失),一些C ++设置,例如异常处理,虚拟成员函数指针表示和其他。您最终会构建数百种变体来支持主流编译器,而您最终仍然会遇到需要它的人。
始终包含源,因此用户可以在其框中重建静态库。或者使用动态库 - 但它有自己的陷阱。
<强>命名空间强>
如上所述,使用命名空间来避免冲突。不要过分,如果你有源包括用户可以随时重新命名它。但请记住,using namespace
声明不应出现在标题中,因此需要稍微调整代码。
答案 3 :(得分:0)
如果你给出你的静态库,你不需要包含foo.c,因为这将是lib的一部分,如果他们有自己的foo.c,它会混淆编译器和链接器,如果你可能会导致问题两者都有相似的功能,或者包含错误的标题。
解决此问题的最佳方法是为代码使用命名空间,从而使其保持唯一。
namespace myfooname
{
void foo()
{
//stuff
}
}