【问题标题】:Hiding functions in static library在静态库中隐藏函数
【发布时间】:2012-10-23 11:03:59
【问题描述】:

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

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

我想使用static,但是静态函数should be只能在“当前.c文件”中使用,所以这不是办法。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 为什么要取消该选项?顺便说一句,因为该选项有效,它表明没有任何根本原因导致这是不可能的,只是编译器出现以来没有改变的糟糕的编译器架构。
    【解决方案2】:

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

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

    -r -x -exported_symbols_list ../exported_symbols.txt -o $@ $^ 在makefile中。


    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 平台上可能有等效的方法。

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多