1

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

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++。

4

5 回答 5

2

您的包装纸是否足够薄,可以内联?

于 2009-02-19T21:09:55.557 回答
0

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

于 2009-02-19T21:23:55.090 回答
0

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

// Call OpenGL::glFunction();
using namespace OpenGL;
glFunction();
于 2009-05-18T22:05:57.370 回答
0

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

在 Visual C++ 中,进入文件的属性,包括您的 opengl.h,在 Preprocessor 中启用“Generate Proprocessed File”选项(/P)

这将生成一个 .i 文件

于 2009-02-19T22:19:58.860 回答
0

问题不在于您发布的内容的定义,而在于您的调用。您可以发布有关如何调用该函数的相关代码吗?

OpenGL::glFunction();将是我会怎么做,它会工作。

于 2011-07-10T22:19:38.137 回答