我在存档文件clib.a
中有一个C库。我已经为它编写了一个c++包装器,cpp.o
,并希望将其用作静态库:
ar cTrvs cppwrap.a clib.a cpp.o
链接到此的代码将无法直接使用clib.a
的东西,除非包含正确的标题。然而,如果有人碰巧创造了一个合适的原型——例如void myCoincidentallyNamedGlobalFunction()
——我担心myCoincidentallyNamedGlobalFunction
的定义是否适用。
由于clib.a
的符号只需要在cpp.o
中访问,而不是链接到cppwrap.a
的任何东西,是否有一种方法可以完全隐藏它们,以便没有可能的碰撞(因此即使包括clib标头也会失败)?
您可以手动删除最终组合库中不需要的符号:
$ objcopy -N foo cppwrap.a
(remove symbol)
或者,如果您需要这些符号,但要确保外部用户无法访问它们:
$ objcopy -L bar cppwrap.a
(localalize symbol)
或者,如果clib.a
中的符号必须在cpp.o
中可见,但你不希望它被其他人使用:
$ objcopy -W baz cppwrap.a
(弱符号)
在这种情况下,与其他目标文件/库中的符号的冲突将推迟其使用,即使该符号仍然是可见的。为了进一步模糊事物或减少恭敬碰撞的机会,您还可以使用:
$ objcopy --redefine-sym old=new cppwrap.a
匿名命名空间在某些情况下可能会有所帮助,但如果包装器需要功能但试图隐藏外部用户,则不起作用。