我在归档文件中有一个C库clib.a
。我为它写了一个C ++包装器cpp.o
,并希望将它用作静态库:
ar cTrvs cppwrap.a clib.a cpp.o
链接到此代码的代码将无法直接使用clib.a
中的内容,除非包含正确的标头。然而,如果有人巧合地创造了一个合适的原型 - 例如void myCoincidentallyNamedGlobalFunction()
- 我担心 myCoincidentallyNamedGlobalFunction
的定义将适用。
由于clib.a
中的符号只需要在cpp.o
中访问,而不是与cppwrap.a
相关联的任何内容,是否有办法完全隐藏它们以便不会发生碰撞(所以即使包括clib头也会失败)?
答案 0 :(得分:2)
您可以手动删除最终组合库中不需要的符号:
$ 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
匿名命名空间在某些情况下可能会有所帮助,但如果您的包装器需要的功能却试图向外部用户隐藏,则不会有帮助。