【发布时间】:2020-10-02 03:41:06
【问题描述】:
gcc 有一个 -fvisibility 选项,您可以在其中定义哪些函数对链接到您的库的任何人“可见”。虽然这主要用于共享库,但它似乎也可以用于静态库(参见How to apply -fvisibility option to symbols in static libraries?)。
是否可以阻止将我的库与 MSVC 一起使用的人使用某些功能?我不希望我的“内部”函数都在单个翻译单元内,因此“静态”或使用匿名命名空间将不起作用(AFAIK)。
我怎样才能做到这一点?请注意,我特别指的是使用 MSVC 构建的静态 .lib 库。
谢谢
编辑:我与其他人共享我的库,因此这就是我想隐藏某些符号的原因。
【问题讨论】:
-
IIRC MSVC 现在可以只检查库的内容,然后直接转到原始 OBJ 文件,无需解压库内容。 Use Library Dependency Inputs
-
另外,“我的内部功能都在一个翻译单元内”? MSVC 的翻译单元是一个 OBJ 文件。将 OBJ 文件聚合到 LIB 文件中不会合并翻译单元。因此它也不会合并各自的匿名命名空间。
-
如果您确实需要阻止对某些函数的访问,您可以使用两个单独的标题构建库:一个用于“公共”内容,一个用于内部构建。您甚至可以混淆您的“私有”函数,给它们起类似(比如)“FF03A370”的名称,然后在内部标题中有一个
#define MyFunction1 FF03A370行(对于每个) - 这样,它会很棘手(至少可以说)供公共用户捕获您的私人功能。 -
@MSalters 我不明白你的第一条评论与我的问题有什么关系,你能解释一下吗?我需要能够在其他用户无法访问我的内部功能的情况下共享我的 .lib 文件。关于您的第二条评论 - 这正是问题所在。匿名命名空间将不起作用,因为我需要能够(内部)调用不同翻译单元中的函数,而无需为 .lib 文件用户提供外部链接。
-
@AdrianMole 代码混淆绝对是一种选择,但最终我想首先阻止对这些功能的访问。如果我做不到这一点,我很可能会尝试一下。谢谢
标签: c++ c visual-c++