我正在尝试用 C 显示图形,为此我想链接 SDL 库,但这是我第一次做这样的事情,我发现的一切都没有帮助。
我发现我显然需要链接 CMake 中的库,但我看到人们的做法完全不同,而且似乎没有一个对我有用。
我在 Windows 上,如果这很重要的话
这是我当前的 CMake 文件:
cmake_minimum_required(VERSION 3.26)
project(SDLtest C)
set(CMAKE_C_STANDARD 11)
add_executable(SDLtest main.c)
target_include_directories (SDLtest PUBLIC include/SDL2)
find_library(SDL_LIBRARY SDLtest lib)
target_link_libraries(SDLtest LINK_PUBLIC ${TEST_LIBRARY})
这是我正在使用的测试代码:
#include <stdio.h>
#include "SDL.h"
int SDL_main(int argc, char* argv[]){
SDL_Init(SDL_INIT_EVERYTHING); // Initialize SDL2
SDL_Window *window; // Declare a pointer to an SDL_Window
// Create an application window with the following settings:
window = SDL_CreateWindow(
"An SDL2 window", // window title
SDL_WINDOWPOS_UNDEFINED, // initial x position
SDL_WINDOWPOS_UNDEFINED, // initial y position
640, // width, in pixels
480, // height, in pixels
SDL_WINDOW_SHOWN|SDL_WINDOW_OPENGL // flags - see below
);// Check that the window was successfully made
if(window==NULL){
// In the event that the window could not be made...
printf("could not create window: %s\n", SDL_GetError());
return 1;
}
SDL_Event event;
while(1){
SDL_WaitEvent(&event);
switch (event.type) {
case SDL_QUIT : SDL_DestroyWindow(window); SDL_Quit(); break;
default : break;
}
}
}
这些是我遇到的错误(不是所有错误,因为它们是相同的,而且只会占用空间):
C:\Program Files\JetBrains\CLion 2023.2.1\bin\mingw\bin/ld.exe: C:/Projects/SDLtest/main.c:25: undefined reference to `SDL_DestroyWindow'
C:\Program Files\JetBrains\CLion 2023.2.1\bin\mingw\bin/ld.exe: C:/Projects/SDLtest/main.c:25: undefined reference to `SDL_Quit'
C:\Program Files\JetBrains\CLion 2023.2.1\bin\mingw\bin/ld.exe: C:/Program Files/JetBrains/CLion 2023.2.1/bin/mingw/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crtexewin.o):crtexewin.c:(.text+0x130): undefined reference to `WinMain'
如果我错过了任何重要的事情,那是因为我不知道,任何帮助将不胜感激
我在一些帮助下让它工作,这就是我需要做的:
已更换
find_library(SDL_LIBRARY SDLtest lib)
与
find_library(SDL_LIBRARY NAMES libSDL2 libSDL2main HINTS "${CMAKE_CURRENT_SOURCE_DIR}/lib")
在我的 cmake 文件中,对此有一些解释:
SDL_LIBRARY 是我在这里创建的变量的名称,这就是我将放入 targer_link_libraries() 中的内容(请参阅问题),然后 NAMES 是我需要的库文件的名称,在本例中libSDL2 和 libSDL2main,HINTS 后面是这些文件的路径,${CMAKE_CURRENT_SOURCE_DIR} 获取 CMake 文件所在目录的路径,在我的例子中,库位于该目录的 /lib 子目录中
这就是他妈的开始的地方,这让我的 CMake 文件可以工作,但我的代码仍然无法编译,因为出现错误:
undefined reference to WinMain()
这是通过将我的 int SDL_main(int argc, char* argv[])
函数重命名为 int WinMain(int argc, char* argv[])
来修复的,但我相当老实说,我不以任何方式理解这部分,所以我不知道这是否会导致以后出现问题,或者是什么原因导致的。