我在存档文件 clib.a 中有一个 C 库。我已经为它编写了一个 C++ 包装器 cpp.o ,并希望将其用作静态库:

ar cTrvs cppwrap.a clib.a cpp.o

除非包含正确的 header ,否则链接到此的代码将无法直接使用 clib.a 中的内容。但是,如果有人巧合地创建了一个合适的原型(prototype)——例如void myCoincidentallyNamedGlobalFunction() - 我担心 myCoincidentallyNamedGlobalFunction 的哪个定义将适用。

由于来自 clib.a 的符号只需要在 cpp.o 中访问,而不需要任何链接到 cppwrap.a 的东西,有没有办法完全隐藏它们,以便没有可能的冲突(所以即使包含 clib 头也会失败)?

最佳答案

您可以手动删除最终组合库中不需要的符号:
$ objcopy -N foo cppwrap.a(删除符号)

或者,如果您需要符号但想确保外部用户无法访问它们:
$ objcopy -L bar cppwrap.a(本地化符号)

或者,如果 clib.a 中的符号必须 cpp.o 中的某些内容可见,但您不希望它被其他任何人使用:
$ objcopy -W baz cppwrap.a(弱化符号)

在这种情况下,与来自其他目标文件/库的符号的冲突将遵循它们的使用,即使该符号仍然可见。为了进一步模糊事物或减少甚至是恭维碰撞的机会,您还可以使用:
$ objcopy --redefine-sym old=new cppwrap.a
匿名命名空间 在某些情况下可能会有所帮助,但如果您的包装器需要但试图对外部用户隐藏的功能,则不会。

关于c++ - 从链接对象限制全局符号的范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23678896/

10-11 23:18
查看更多