4

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

ar cTrvs cppwrap.a clib.a cpp.o

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

由于符号 fromclib.a只需要在 中访问cpp.o,而不是任何链接到cppwrap.a,有没有办法完全隐藏它们,以免发生冲突(所以即使包含 clib 标头也会失败)?

4

1 回答 1

3

您可以手动删除最终组合库中不需要的符号:

$ objcopy -N foo cppwrap.a(删除符号)

或者,如果您需要符号但想确保外部用户无法访问它们:

$ objcopy -L bar cppwrap.a(本地化符号)

或者,如果某个符号 inclib.a 必须对 in的某物可见,cpp.o但您不希望它被其他任何人使用:

$ objcopy -W baz cppwrap.a(弱化符号)

在这种情况下,与来自其他目标文件/库的符号的冲突将推迟到它们的使用,即使该符号仍然是可见的。为了进一步模糊事物或减少甚至是恭顺的碰撞的机会,您还可以使用:

$ objcopy --redefine-sym old=new cppwrap.a

在某些情况下,匿名命名空间可能会有所帮助,但如果您的包装器需要某些功能但试图对外部用户隐藏,则无济于事。

于 2014-05-15T13:36:31.987 回答