3 回答

TA贡献1851条经验 获得超3个赞
C标准的规则对这些规则施加了一些限制(用于安全编译):AC编译器可能只查看标识符的前8个字符,因此foobar2k_eggs和foobar2k_spam可以被有效地解释为相同的标识符 - 但是每个现代编译器都允许任意长标识符,所以在我们这个时代(21世纪),我们不应该为此烦恼。
这不仅仅是现代编译器的延伸; 当前的C标准还要求编译器支持合理长的外部名称。我忘记了确切的长度,但如果我没记错的话,它就像31个字符。
但是如果你面对一些你无法改变符号名称/标识符的库呢?也许你只有一个静态二进制文件和标题或者不想要,或者不允许自己调整和重新编译。
然后你就被困住了。抱怨图书馆的作者。我曾经遇到过这样一个错误:我的应用程序的用户由于Debian的libSDL
链接而无法在Debian上构建它libsoundfile
,这至少在当时用可变的类似的方式污染了全局命名空间dsp
(我小时候你不会!)。我向Debian抱怨,他们修复了他们的软件包并将修复程序发送到上游,我认为它已经应用了,因为我再也没有听说过这个问题。
我真的认为这是最好的方法,因为它解决了每个人的问题。你做的任何本地黑客都会将问题留在库中,以便下一个不幸的用户再次遇到并与之抗争。
如果你真的需要快速修复,并且你有源代码,你可以-Dfoo=crappylib_foo -Dbar=crappylib_bar
在makefile中添加一堆等来修复它。如果没有,请使用objcopy
您找到的解决方案。
- 3 回答
- 0 关注
- 1034 浏览
添加回答
举报