隐藏静态库中的函数

时间:2012-10-23 11:03:59

标签: visual-studio-2010 linker export static-libraries dllexport

我正在为一个大项目构建.lib静态库),我想隐藏一些函数给库的最终用户,但我需要这些函数可以从库中的每个.c文件调用(因此不是静态的)。

这与__declspec(dllexport)完全相反,我已经为gcc找到了解决方案。

我想使用static,但静态函数should be仅在“当前.c文件”中可用,因此不是这样。

换句话说:我需要一种方法告诉M​​icrosoft Visual C ++ 2010不要将某些函数导出到最终.lib(同时让它们可用于所有其他.c项目内的文件)。

注意:我从未在我的整个解决方案中使用__declspec__attribute__( visibility)},这可能只是与构建静态库(我无法跟踪)相关的一些默认设置。

1 个答案:

答案 0 :(得分:4)

这是不可能的。您所要求的与__declspec(dllexport)无关,这是一个确定DLL外部可见标识符的属性。这肯定符合您的要求。

但是你要求一个静态库。这是一个非常简单的文件格式,它只是一包.obj文件。编译后由lib.exe放入存档。根本没有任何事情可以解决.lib中单独编译的.c文件之间的依赖关系。直到链接.lib才会发生这种情况。

此时,客户端代码使用的外部链接标识符与您的标识符之间没有任何区别。如果可能的话,任何尝试隐藏你的东西,如果链接器无法弄清楚如何满足你的一个.c文件与另一个文件的外部依赖关系,就会产生链接失败。

获得任何接近的唯一方法是在单个翻译单元中所有代码,其中的功能标记为静态,因此它们没有外部链接。这可能很难看,但可以通过#includes所有其他.c文件的单个文件来完成。当然你会忽略这个选项,所以请寻求DLL解决方案来实现这个目标。