提问人:CrySa 提问时间:11/9/2023 最后编辑:genpfaultCrySa 更新时间:11/10/2023 访问量:41
如何使用 CMake 在 Clion 中链接库?
How do I link libraries in Clion using CMake?
问:
我正在尝试用 C 语言显示图形,为此我想链接 SDL 库,但这是我第一次做这样的事情,我发现的一切都无济于事。
我发现我显然需要链接 CMake 中的库,但我看到人们这样做的方式完全不同,而且它们似乎都不适合我。
我在窗户上,如果这很重要的话
这是我当前的 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'
这是我的文件结构: clion 文件结构
如果我错过了任何重要的事情,那是因为我不知道,任何帮助将不胜感激
答:
我在一些帮助下让它工作,这是我需要做的:
取代
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 文件开始工作,但我的代码仍然没有编译,因为一个错误指出:这是通过重命名我的函数来修复的,但老实说,我不以任何方式理解这部分,所以 idk 如果这会导致以后出现问题或导致这种情况的原因。undefined reference to WinMain()
int SDL_main(int argc, char* argv[])
int WinMain(int argc, char* argv[])
评论
find_library
SDL_LIBRARY
target_link_libraries
TEST_LIBRARY
find_library
${CMAKE_CURRENT_SOURCE_DIR}
CMakeLists.txt
find_library(SDL_LIBRARY NAMES libSDL2 libSDL2main HINTS "${CMAKE_CURRENT_SOURCE_DIR}/lib")
undefined reference to 'WinMain'