C++ 静态库、链接和依赖项

C++ 静态库、链接和依赖项,c++,linker,C++,Linker,我有一个我想发布的静态库,其中包含Foo.c/h,有人会把它取出来,并将我的静态库包含在他们的应用程序中 假设他们的应用程序中也有Foo.c/h。他们会有链接错误吗 源文件的名称在链接过程中并不重要 如果文件具有相同的内容,那么您将遇到问题,假设.c文件包含导出的符号(例如非静态或非模板函数或外部变量)。这取决于具体情况。如果foo.c和foo.h定义了相同的函数和/或变量,那么肯定会有多个定义错误。如果它们只有相同的文件名,但包含不同的代码,这不会有问题。如果您提供静态库,则不需要包含foo.

我有一个我想发布的静态库,其中包含Foo.c/h,有人会把它取出来,并将我的静态库包含在他们的应用程序中


假设他们的应用程序中也有Foo.c/h。他们会有链接错误吗

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


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

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

如果您提供静态库,则不需要包含foo.c,因为这将是库的一部分,如果他们有自己的foo.c,则会混淆编译器和链接器,如果您都有相似的函数或包含错误的头,则可能会导致问题

解决此问题的最佳方法是为代码使用名称空间,从而保持其唯一性

namespace myfooname
{

void foo()
{
//stuff
}


}

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

不要分发静态库(无源)

首先,您不应该单独重新分发静态库。代码和兼容性依赖于编译器,以及许多常见的设置,比如运行时库(静态/动态、调试/发布、单线程的VC都幸免),一些C++设置,例如异常处理、虚拟成员函数指针表示等。您最终构建了数百个变体来支持主流编译器,但最终仍然会遇到一些需要它的人,只是有些不同而已

始终包含源代码,以便用户可以在其框中重建静态库。或者使用一个动态库——但它有自己的局限性

名称空间

如前所述,使用名称空间以避免冲突。不要过火,如果你包含了源代码,用户总是可以重新命名它。但是请记住,
使用名称空间
声明不应该出现在头中,因此代码需要稍微调整。

您提到的所有导致静态库问题的问题也会导致DLL问题,事实上也会导致任何编译代码的问题。使用DLL,您可以将分配移动到DLL中,出口工厂。这使您摆脱了运行时库的选择。但你是对的,这对异常或“更棘手”的事情没有帮助。或者换一种说法:根据我的经验,设计良好的DLL在实践中不是什么问题。