【发布时间】: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