包装器的C ++链接器问题

时间:2009-02-19 21:05:38

标签: c++ linker wrapper

我有一个库opengl.lib,它包含所有opengl函数的包装函数。函数在它们自己的命名空间中声明,以便可以使用与opengl函数相同的名称命名包装函数。所以在包装函数中,使用:: gl ***();

调用opengl函数
opengl.h:
namespace OpenGL {
    void glFunction();
}

opengl.cpp:
void OpenGL::glFunction() {
    ::glFunction();
}

现在的问题是,当我在我的应用程序中使用这个opengl.lib并包含我自己的“opengl.h”时,由于某种原因真正的opengl函数被直接调用而不是我的包装函数。

我已经确定我没有包含任何真正的opengl.h所以这必须是某种链接器问题。我该如何解决?我在库路径中也有真正的opengl库,因为否则我在opengl.lib中会遇到链接器错误,因为它使用真正的opengl函数。所以真正的opengl库和我的opengl.lib以某种方式混合,链接器决定使用真正的opengl.lib而不是我的。

我知道我可以通过将我的包装函数重命名为其他东西来解决这个问题,但我想使用相同的名称。

此问题与我之前的问题C++ wrapper with same name?

有关

我正在使用禁用优化的Visual C ++。

5 个答案:

答案 0 :(得分:2)

你的包装纸是否足够薄以至于它们被内联?

答案 1 :(得分:0)

实际的opengl.h是否与包装头文件命名相同?如果是,可能 包括它而没有意识到,因为编译器在用户定义的路径之前搜索系统路径。

答案 2 :(得分:0)

查看预处理的cpp文件对解决此类问题非常有帮助。

在visual C ++中,进入包含opengl.h的文件属性,在预处理器中启用“生成预处理文件”选项(/ P)

这将生成一个.i文件

答案 3 :(得分:0)

在构建opengl.lib时,您只需要与真正的opengl lib链接。确保您没有对使用您自己的lib的项目中的真实opengl lib的任何引用。如果您没有对真实lib的任何引用,则无法调用实际函数。完成后,请确保使用正确的命名空间。

// Call OpenGL::glFunction();
using namespace OpenGL;
glFunction();

答案 4 :(得分:0)

问题不在于您发布的内容的定义,问题在于您的调用。你可以发布相关代码来调用函数吗?

OpenGL::glFunction();将是我如何做到的,它会起作用。