动态链接库中的char *类型的函数参数(dll / so)

时间:2016-04-14 18:10:55

标签: c++ c opengl linker

我编译了一个特定于供应商的OpenGL标题,该标题旨在使用特定于硬件的静态库进行编译,但我使用nVidia Quadro 4000卡和库(linux)进行链接和运行。这就是我们的供应商说我们应该在主机环境中这样做,所以不用担心。

我发现了一些奇怪的东西。特定于供应商的标题将GLchar typedeffed作为'unsigned char'(叹息......),而nVidia标题类型将其设置为'char'。这些类型不一样,但它仍然“有效”。我无法隐式地将char *转换为unsigned char *,这给了我一个编译错误,但我可以链接AND成功运行可能使用'char'原型构建的函数(glGetUniformLocation)库。

发生什么事了?运行时是否通过判断'char'与'unsigned char'“足够接近”来解决它?或者在建立图书馆时,“char”的出现是否扩展到一个签名或另一个签名?如果是这样,如果我用一种具有所有三种签名的函数重载会发生什么?

编辑:注意OpenGL库使用C-linkage来解释我在接受的答案中描述的特定体验。

1 个答案:

答案 0 :(得分:3)

使用C链接时,函数按其文字名称链接。与名称为mangling的C ++不同,没有什么可以控制参数的类型。当程序调用函数时,它将参数放在堆栈或寄存器中(根据调用约定)并且函数读取它。指针被放(4或8字节),指针被读取(相同大小)。调用者将指针解释为unsigned char*,被调用者将其解释为char*

如果被调用者读取的字节多于或少于调用者放置的字节数,则堆栈将被破坏,从而导致奇怪的,不需要的行为。

如果在调用者放置int之后被调用者读取float,被调用者将处理垃圾而不是敏感数据。