我自己的库给了我“对 <function_name> 的未定义引用

Posted

技术标签:

【中文标题】我自己的库给了我“对 <function_name> 的未定义引用【英文标题】:My own library is giving me "undefined reference to <function_name> 【发布时间】:2020-12-06 20:29:00 【问题描述】:

我正在尝试为我的游戏制作一个由 SDL 制作的静态库,以简化我的游戏制作过程。

我正在使用 Code::Blocks 和 gcc 编译器,以及 C 语言。

我在库项目中链接了 SDL,并开始制作一些功能。然后我编写了一个测试项目,并将 SDL 和我的库都链接到它。但是当我尝试执行它时,它给了我对库中变量和 SDL 函数的未定义引用。我的库的函数可以工作,但它们在内部调用 SDL 函数,而这些函数会给我未定义的引用错误。

lib.h 文件如下所示:

#pragma once
#include <SDL2/SDL.h>

extern int awesomeInteger;

extern void foo();

lib.c 看起来像这样:

#include "lib.h"

int awesomeInteger = 5;

void foo() 
   awesomeInteger = 6;
   SDL_Function();

最后,实际的游戏代码如下所示:

#include "lib.h"
// the lib.a file is already linked

int main() 
   foo();

然后SDL_Function()出现未定义的引用错误...

日志如下所示:

||=== Build: Debug in ExampleProject (compiler: GNU GCC Compiler) ===|
/usr/bin/ld: obj/Debug/lib.o||in function `foo':|
/home/username/Documents/Dev/ExampleProject/lib.c|10|undefined reference to `SDL_Function'|
||error: ld returned 1 exit status|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

【问题讨论】:

你做了 libsdl 的 make install 吗? 不,有必要吗? 你的链接命令是什么样子的? 尝试配置您的项目以构建共享库而不是静态库。这两种类型不能很好地混合在一起——您的静态库的函数很可能无法使用 SDL 动态库中的函数,如果您的系统只有动态 SDL 库而不是静态库,这并不罕见。 在 2020 年,构建静态库的理由很少(至少在 Linux 上)。见Program Library HowTo 【参考方案1】:

在不知道编译和链接的详细信息及其日志的情况下,这里是手动构建的参考:

    创建您的静态库(仅编译无链接,稍后您会将必要的库链接到您的实际可执行文件中)

gcc mylib.c -c

    [可选] 如果您有多个目标文件,您可以创建一个存档(目标文件的集合)

ar rcs libmylib.a obj1.o obj2.o

    通过在构建中包含目标文件并将库添加到您的程序中,并与 SDL 链接。

gcc -lSDL2 mygame.c libmylib.a

【讨论】:

我不明白你为什么认为这回答了这个问题。 OP 声称他们正在成功构建静态库,并且当他们尝试链接程序时,他们同时包含了该库和适当的 SDL 库。那么,你是说他们做错了什么,或者没有做什么? 公平点,但它可以作为手动构建过程的指导方针,例如消除由 code::blocks 构建自动化引入的任何时髦业务。编辑,我觉得评论太长了。 好的,但是这不能回答问题 我编辑了这篇文章以反映它只是一个参考指南。

以上是关于我自己的库给了我“对 <function_name> 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

关于拆分PDF和OCR识别

GO使用image/draw库给图片添加水印完全解析

GO使用image/draw库给图片添加水印完全解析

为 macOS 不兼容的库安装 opencv

各位大神,我需要安装wps,别人给了我安装包,但是我打开之后在自己电脑上不会安装,跪求大神,如何装

iOS 使用pod安装svn/git上的库