如何使用 CMake 在 Clion 中链接库?

How do I link libraries in Clion using CMake?

提问人:CrySa 提问时间:11/9/2023 最后编辑:genpfaultCrySa 更新时间:11/10/2023 访问量:41

问:

我正在尝试用 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 文件结构

如果我错过了任何重要的事情,那是因为我不知道,任何帮助将不胜感激

c cmake sdl clion 未定义引用

评论

0赞 Tsyvarev 11/9/2023
您调用 with 作为变量名称,但在调用中,您改用变量。find_librarySDL_LIBRARYtarget_link_librariesTEST_LIBRARY
0赞 CrySa 11/9/2023
@Tsyvarev哦,该死的,这对我来说很愚蠢,但这不是唯一的问题,现在它说找不到图书馆
0赞 Tsyvarev 11/9/2023
在调用中,提示应为绝对路径。用于引用当前已处理的目录。find_library${CMAKE_CURRENT_SOURCE_DIR}CMakeLists.txt
0赞 CrySa 11/10/2023
@Tsyvarev它仍然说未找到
0赞 CrySa 11/10/2023
我设法使用这一行让它工作,但现在当我尝试编译它时,它说虽然这似乎是一个全新的问题,所以 idk,我会查找它并希望能找到一些东西find_library(SDL_LIBRARY NAMES libSDL2 libSDL2main HINTS "${CMAKE_CURRENT_SOURCE_DIR}/lib")undefined reference to 'WinMain'

答:

0赞 CrySa 11/10/2023 #1

我在一些帮助下让它工作,这是我需要做的:

取代

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[])