c语言.so传入参数不对,关于c ++:动态链接库(char / so)中char *类型的函数参数

我编译了供应商特定的OpenGL标头,意在使用硬件特定的静态库进行编译,但是我链接并运行了nVidia Quadro 4000卡和库(Linux)。这就是我们的供应商所说的,我们应该在主机环境中进行操作,因此不必担心。

我发现有些奇怪。供应商特定的标头将GLchar类型化为'unsigned char'(叹息...),而nVidia标头将其类型化为'char'。这些类型不相同,但仍然可以使用。我不能将char *隐式地转换为unsigned char *,这给了我一个编译错误,但是我可以链接并成功运行可能使用'char'原型构建的函数(glGetUniformLocation)库。

发生了什么?运行时是否通过确定'char'与'unsigned char'足够接近来解决它?还是在构建库时将" char"的出现扩展为一个签名?如果是这样,如果我用所有三种签名重载一个函数,将会发生什么?

编辑:请注意OpenGL库使用C-linkage,它解释了我在接受答案中所描述的特殊经验。

使用C链接时,函数按其文字名称链接。 与名称乱码的C ++不同,没有任何东西可以控制参数的类型。 当您的程序调用函数时,它将参数放在堆栈或寄存器中(根据调用约定),然后函数读取它。 放置指针(4或8个字节),读取指针(大小相同)。 调用方将指针解释为unsigned char*,被调用方将其解释为char*。

如果被调用方读取的字节多于或少于调用方放置的字节,则堆栈将被破坏,这将导致奇怪的不良行为。

如果被叫方在放入呼叫方float之后读取了int,则被叫方将处理垃圾而不是敏感数据。

啊对。 我忘记了OpenGL库正在使用c链接。

@Andreas啊,很高兴您了解发生了什么事。 我已经添加了一些笔记,这些笔记可能对您很明显。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值