如何链接自定义静态库?

Posted

技术标签:

【中文标题】如何链接自定义静态库?【英文标题】:How to link custom static library? 【发布时间】:2017-09-26 02:40:23 【问题描述】:

我正在为自己制作一个静态库,以便在使用 c++ OpenGL freeglut 制作游戏/模拟器时使用。我称这个库为 GLUtils。它添加了struct Vectorstruct Colornamespace GL,其中包含void GL::drawShape(Vector *points, Color *colors, int size) 等方法。我在 Visual Studio 2017 中使用静态版本的 freeglut 编译 GLUtils,它编译得很好,当我编译我的测试用法时它编译得很好,当我运行它时它工作得很好,直到我添加了 opengl 的东西。测试仍然编译得很好,但它在加载 Application failed to start properly 时崩溃了,当我去调试它时,它在加载 main 之前崩溃了。使用 Dependency Walker 并打开 test.exe 唯一显示为红色的是 freeglut.dll 下的 kernel32.dll 但 kernel32.dll 依赖项已满足,并且 GLUtils.lib 不在列表中(但我认为这是因为它是静态的)。

即使我注释掉 GLUtils.cpp 中的实现并将正文保留为

void GL::drawShape(Vector * points, ColorRGBA * colors, int size)

    for (int i = 0; i < size; i++)
    
        //glColor4f(colors[i].r, colors[i].g, colors[i].b, colors[i].a);
        //glVertex3f(points[i].x, points[i].y, points[i].z);
    

Test.exe 仍然崩溃并出现同样的错误。

我应该如何将 GLUtils.lib 和 freeglut.lib 链接到 Test.exe?

【问题讨论】:

使用 #pragma comment(lib, "GLUtils.lib") 并对 freeglut 做同样的事情 在 Test.cpp 或我正在使用的任何文件中?在添加 opengl 内容之前,我不必这样做。 您的测试项目应该链接到这些库。所以不管你把它放在哪个文件中 【参考方案1】:

这个错误的原因可能是由类型冲突引起的。

void GL::drawShape(Vector * points, ColorRGBA * colors, int size)

对于上述函数声明,您想使用您在 GLUtils 中创建的结构定义,但链接器发现这些结构名称已在其他库中定义并与它们链接以为您创建执行文件。

要解决这个错误,你应该明确告诉链接器你想使用哪个定义,比如流动。

void GL::drawShape(GL::Vector * points, GL::ColorRGBA * colors, int size)

【讨论】:

以上是关于如何链接自定义静态库?的主要内容,如果未能解决你的问题,请参考以下文章

讨论:动态链接库如何给主程序发送自定义消息?

RF自定义库

如何自定义wordpress文章的固定链接

ios 本地工程加载自定义动态库时,需要对动态库进行签名吗

有关C语言的内部函数和外部函数的定义说明

如何自定义wordpress文章的固定链接