我自己的库给了我“对 <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> 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章