提问人:Ivan Gyulev 提问时间:4/4/2022 最后编辑:genpfaultIvan Gyulev 更新时间:4/4/2022 访问量:667
如何链接外部 dll,更具体地说,如何手动编译 SDL?[复制]
How To Link External Dlls And More Specifically How To Manually Compile SDL? [duplicate]
问:
最近,我停止使用 IDE,试图更多地了解编程的基础设施;我开始使用 MinGW 的编译器(以及相应的)和 PowerShell 的帮助编译我的 C++ 和 C 代码。g++.exe
gcc.exe
这一切都很顺利,直到我想再次将 SDL 用于一个项目,但在手动链接时惨遭失败。我想先说,我已经读了很多关于链接、文件和编译器标志的文章,但我正在努力理解编译器的工作方式。.dll
gcc
我的基本理解是,当你想使用DLL时,你需要一个库文件来链接头文件中的函数、变量等的名称与二进制文件中这些东西的位置,但情况似乎并非总是如此,因为当我制作自己的DLL()时,我只需要这样链接它, 没有任何库文件。.dll
gcc -shared -o mydll.dll mydll.o
gcc main.c -o main -L . -l:mydll.dll
虽然如果我设法编译 SDL,也许我没有尝试过的东西,比如 GLFW 甚至 OpenGL,我会理解它,但经过大量的阅读和尝试,我仍然没有成功。从小处着手,我只关心用 C 语言用 SDL 编译一个小程序,我只展示我的一次尝试。
第 1 步
我从这里得到了 MinGW 的开发库。从文件夹中获取内容,因为这是我正在使用的操作系统。从主文件夹中的 bin 文件夹中取出,因此它是可执行文件所在的位置。(为了保持简单,我避免使用二进制文件、目标文件、源代码和头文件的文件夹,直到我了解自己在做什么)。然后我删除了共享文件夹和 bin 文件夹,因为我认为我不需要它们。我留下了以下文件夹内容(制作文件后):x86_64-w64-mingw32
SDL2.dll
main.c
步骤 2
在文件中写了以下内容:main.c
#include <stdio.h>
#include <SDL2/SDL.h>
int main(int argc, char *argv[]) {
if (!SDL_Init(SDL_INIT_EVERYTHING)) printf("SDL Error: %s\n", SDL_GetError());
SDL_Window *window = SDL_CreateWindow("test", 0, 0, 960, 540, SDL_RENDERER_ACCELERATED);
SDL_Delay(5000);
SDL_Quit();
return 0;
}
步骤 3
尝试使用一个命令进行编译(跳过先将所有内容转换为目标文件):
gcc main.c -o main -L lib -l:libSDL2.a -l:libSDL2main.a -I include
步骤 4
收到此错误消息,这是我一直在编译 SDL 或 GLFW 时走得最远的错误消息
C:\Users\igyul\AppData\Local\Temp\cc4Vbdvm.o:main.c:(.text+0xe): undefined reference to `SDL_Init'
C:\Users\igyul\AppData\Local\Temp\cc4Vbdvm.o:main.c:(.text+0x17): undefined reference to `SDL_GetError'
C:\Users\igyul\AppData\Local\Temp\cc4Vbdvm.o:main.c:(.text+0x5b): undefined reference to `SDL_CreateWindow'
C:\Users\igyul\AppData\Local\Temp\cc4Vbdvm.o:main.c:(.text+0x6a): undefined reference to `SDL_Delay'
C:\Users\igyul\AppData\Local\Temp\cc4Vbdvm.o:main.c:(.text+0x6f): undefined reference to `SDL_Quit'
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
答:
好吧,假设 dll 应该在它需要的地方并且 windows/gcc 知道它在哪里,那么这个解决方案就可以工作,这是一个如此回答的问题,可以解决您的问题,以防 gcc 找不到 sdl2 库(我更习惯于与具有专用库路径的 Linux 一起使用)您还将添加 -LC:\your_library_path第二个 gcc 命令,因为您从库目录中拉出 dll
我已经获取了您的代码并使用以下命令运行它
gcc main2.c -c
gcc main2.o -o main2 -lSDL2
这是你的代码
#include <stdlib.h>
#include <stdio.h>
#include "SDL2/SDL.h"
int main(int argc, char **argv){
if (!SDL_Init(SDL_INIT_EVERYTHING)){
printf("SDL Error: %s\n", SDL_GetError());
}
SDL_Window *window = SDL_CreateWindow("test", 0, 0, 960, 540, SDL_RENDERER_ACCELERATED);
SDL_Delay(5000);
SDL_Quit();
return 0;
}
它“刚刚工作”,直到我执行实际的可执行文件,它给了我一个“SDL 错误”并停止执行,但以上回答了您的问题
评论
-l:libSDL2.a
通常拼写为 。您的库顺序错误,您忘记了 .它应该是.-lSDL2
-lmingw32
-lmingw32 -lSDL2main -lSDL2