我的存档文件中有一个 C 库,clib.a
。我已经为它编写了一个 C++ 包装器,cpp.o
,并想将其用作静态库:
ar cTrvs cppwrap.a clib.a cpp.o
链接到此的代码将无法使用来自的内容clib.a
直接,除非包含正确的标头。然而,如果有人巧合地创建了一个合适的原型——例如void myCoincidentallyNamedGlobalFunction()
- 我很关心which的定义myCoincidentallyNamedGlobalFunction
将会应用。
由于符号来自clib.a
只需要在cpp.o
,并且没有任何链接到cppwrap.a
,有没有办法完全隐藏它们,这样就不会发生冲突(所以即使包含 clib 头也会失败)?
您可以手动删除最终组合库中不需要的符号:
$ objcopy -N foo cppwrap.a
(删除符号)
或者,如果您需要符号但想确保外部用户无法访问它们:
$ objcopy -L bar cppwrap.a
(本地化符号)
或者,如果一个符号clib.a
must被某物可见cpp.o
但你不希望它被其他人使用:
$ objcopy -W baz cppwrap.a
(弱化符号)
在这种情况下,与其他目标文件/库中的符号的冲突将推迟到它们的使用,即使该符号仍然可见。为了进一步模糊事物或减少甚至是恭敬的碰撞的机会,您还可以使用:
$ objcopy --redefine-sym old=new cppwrap.a
An 匿名命名空间在某些情况下可能会有所帮助,但如果您的包装器需要某些功能但试图对外部用户隐藏,则不会。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)