5

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

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

我想使用static,但静态函数应该只在“当前.c文件”中可用,所以这不是方法。

换句话说:我需要一种方法来告诉 Microsoft Visual C++ 2010 不要将某些函数导出到 final .lib(同时保持它们可用于.c项目中的所有其他文件)。

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

4

2 回答 2

4

这是不可能的。您所要求的与 __declspec(dllexport) 无关,该属性确定哪些标识符在 DLL 之外可见。这肯定会满足您的要求。

但是您要的是静态库。这是一种非常简单的文件格式,它只是一袋 .obj 文件。编译后通过lib.exe打包成一个归档文件。根本没有解决 .lib 中单独编译的 .c 文件之间的依赖关系。在链接 .lib 之前不会发生这种情况。

此时,客户端代码使用的具有外部链接的标识符与您的标识符完全没有区别。如果可能的话,尝试隐藏您的文件只会在链接器无法弄清楚如何满足您的一个 .c 文件与另一个文件的外部依赖关系时造成链接失败。

接近的唯一方法是将所有代码放在一个翻译单元中,函数标记为静态,因此它们没有外部链接。这非常难看,但可以通过一个包含所有其他 .c 文件的文件来完成。您肯定会忽略该选项,因此请寻求 DLL 解决方案来获得此选项。

于 2012-10-26T16:38:55.830 回答
1

我认为从静态库中隐藏内部符号并且只将一些符号导出给外部用户是可能的,至少在 Linux 平台上是可能的。

我曾经在具有类似要求的 OSX 和 Linux 上工作,我的方法是尝试使用具有以下选项的“ ld ”命令创建一个预链接库:

-r -x -exported_symbols_list ../exported_symbols.txt -o $@ $^ 在生成文件中。


用于 xcrun ld 的选项如下

-x

    Delete all local symbols.

-r

    Generate relocatable output--i.e., generate an output file that can in turn serve as input to ld. This is often called partial linking

-exported_symbols_list

    option uses a text file exported_symbols.txt which contains all the interface APIs for the static library that you want to ship out.

我想在 Windows 平台上可能有等效的方法。

于 2016-08-15T04:45:49.637 回答