【发布时间】:2018-05-01 11:01:21
【问题描述】:
我正在编译和归档一个库(称之为libbar.a)。该库中的关键翻译单元使用在foo.cpp 中定义(非静态)的函数void foo(),该函数也被编译并放入库中。
我想避免这个void foo() 与我的代码库(使用该库)中其他地方的其他符号发生冲突。现在,您可以说 - 只是不要包含声明 void foo() 的标头;但是 - 如果我真的在其他地方使用相同的 void foo() 怎么办?尽管在我的整个代码库中只使用一次会更有效,但我实际上希望任何使用该库的人都忘记void foo() 在内部使用的实现细节。所以 - 我希望没有人能够在 libbar.a 中查找该符号,但 libbar.a 中的代码仍然能够使用它。
我怎样才能做到这一点?
注意事项:
- 代码(
foo和我的库)是 C 和/或 C++。假设它是纯 C 或纯 C++ 的答案也是相关的。 - 我意识到,如果我更改名称(例如更改为
void bar_foo()),或将void foo()放入命名空间,可能会产生预期的效果。但我不需要这样做,即我需要继续为void foo()使用相同的代码而不做任何更改。我只愿意更改使用void foo()的库代码和构建机制中的内容。 - 我在 Linux 上使用 gcc;不过,我希望有一些适用于 clang 或与编译器无关的东西。我还使用 CMake 自动化构建,但不必费心编写 CMake 代码 - 只需概括地说您希望构建系统执行的操作即可。
【问题讨论】:
-
如果您将宝贵的
foo()放在单独的静态库中并将其链接到您的libbar.a,会发生什么? -
这是一个毫无意义的问题,因为您本质上是在问“如何在不使用唯一名称的情况下避免名称冲突”。
-
我认为
ar格式的静态库是不可能的。对于.so格式的动态库(以及对于 Windows DLL),您可以控制导出哪些符号。 -
我认为在构建库时,您需要为链接器提供一个选项,以从导出的符号中删除 foo
-
@einpoklum 你清楚地说你不能接触源代码,C 和 C++ 是关于代码问题,而不是关于编译和链接。你看过benjarobin提供的链接吗,我想它可能会回答你的问题stackoverflow.com/a/6940389/7076153
标签: gcc cmake static-libraries libraries unix-ar