我在存档文件 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/