使局部符号全局化
Making a local symbol global
有没有办法增加共享对象中函数的符号范围?
我正在移植一个使用glDrawTexiOES的OpenGL ES 1.x示例,该示例在为我所使用的板提供的OpenGL ES库中定义,但被定义为本地符号,因此当我编译&链接这个例子,它给了我一个未定义的引用。
不幸的是,这是不可能的,因为自动变量是在内存中布局的。(它们不存在于稳定、永久的内存位置。)你唯一能做的就是分配一个全局变量,并在适当的时候将本地变量复制到全局中。但在这种情况下,您可能只需要在整个过程中使用全局变量。
不存在一个变量"成为全局变量"的特定时间点。全局变量必须在加载时为程序所知,并且在程序的整个生命周期中都存在。
我认为,如果不通过一些自定义程序或非常低级别的ELF实用程序将库编辑为二进制文件,就不可能将本地符号的配置更改为全局符号。但我不建议将这种方法用于任何要在生产中运行或打算维护的内容。
然而,我对GL也不太了解:
-
glDrawTexiOES是本地的,因为它被认为是库的一个实现细节。在这种情况下,作为本地符号,您不能使用它,因为库作者明确拒绝您访问,因此可以随时更改其签名和解释。
-
glDrawTexiOES应该是全局的,因为它是GL API的一部分,并且您板的GL库的作者未能通知链接器应该导出符号。如果是这种情况,您应该向上游报告一个错误。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 当vector是tje全局变量时,c++中vector的内存管理
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 将无符号char*转换为std::istream*C++
- 如何创建一个空的全局类并在启动时实例化它
- emscripten 链接全局命名符号乘法定义
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 具有全局符号的命名为STD符号Interfier
- 获取 constexpr 全局变量(不是静态成员)的链接器符号
- 全局符号在链接处变为本地符号
- 错误LNK1169:找到一个或多个乘法定义的符号-全局函数
- 使用名称空间创建全局函数,但得到多个定义的符号错误
- 限制链接对象的全局符号的作用域
- 使局部符号全局化
- #include < windows.h> 在全局命名空间中定义了许多符号,例如 Polygon
- 编译器是否在全局符号表中包含没有静态修饰符的全局变量
- 在头文件中定义全局变量时,重复架构x86_64的符号