如果我将 SDL3 构建为项目的一部分,如何链接它?

问题描述 投票:0回答:2

我似乎无法将第 3 方库 SDL 链接到我的主应用程序文件。 我对此很陌生,可能是我没有抓住重点,或者我的项目结构不标准,但答案却让我困惑。 如果我将 SDL 作为项目的一部分进行构建,如何链接它?

项目结构如下:

-App_Name
 -libs
  -sdl <third party library with cmake>
   -<sources downloaded from [libsdl.org](https://www.libsdl.org/)
  -CMakeLists.txt
 -src
  -main.cpp
  -CMakeLists.txt
 -CMakeLists.txt

文件内容

App_Name/libs/CMakeLists.txt

add_subdirectory(sdl)

App_Name/src/CMakeLists.txt

set(SDL_INCLUDES "../libs/sdl/include")
set(SDL_BINARY ../libs/sdl/sdl3.lib)

file(GLOB_RECURSE SOURCES *.cpp)

add_executable(app ${SOURCES})

target_include_directories(app SYSTEM PRIVATE ${SDL_INCLUDES})
target_link_libraries(app SDL3)

应用程序名称/src/main.cpp

#include<iostream>
// #include"SDL3/SDL.h"

int main(int argc, char const *argv[])
{
    std::cout << "hello world working" << std::endl;

    // if(SDL_Init(SDL_INIT_EVERYTHING) != 0){
    //     std::cout << "Error initializing SDL\n" << SDL_GetError() << std::endl;
    // }

    // SDL_Window* win = SDL_CreateWindow("Ford Galaxie Dash", 1240, 400, SDL_WINDOW_RESIZABLE);
  
    return 0;
}

应用程序名称/CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(cmakefun VERSION 0.1.0 DESCRIPTION "Testing SDL" LANGUAGES CXX)

add_subdirectory(src)
add_subdirectory(libs)
cmake sdl
2个回答
2
投票

至少 根据文档,使用供应商的 SDL 时,您

add_subdirectory
供应商的 SDL 目录(包含 SDL 的根 CMakeLists.txt 文件的目录),然后
target_link_libraries
SDL3::SDL3

尝试将您的

target_link_libraries(app SDL3)
更改为
target_link_libraries(app SDL3::SDL3)


0
投票

根据我的经验,如果您使用

SDL3::SDL3
,CMake 可能会变得混乱,并且它可能会意外链接到系统上的另一个随机 3.X 版本。当意图链接到特定供应商版本(通常存储在源目录中)时,我更喜欢使用直接链接可执行文件...

${CMAKE_BINARY_DIR}/deps/SDL/libSDL3.dll.a

以及喜欢的。这消除了歧义,如果您不明确,通常您可能会遇到

.dll
和标题之间不匹配的奇怪问题。

顺便说一句,

.dll.a
lib 文件(在我的例子中是
deps/SDL
)的路径将被构造为在添加了
add_subdirectory()
的目录中复制布局,但在二进制目录中。它由 SDL 自动创建,我相信我描述的方式(显式链接)是预期用途。

所以 CMake 中类似的东西通常可以完成这项工作:

# Add dependencies
add_subdirectory(${CMAKE_SOURCE_DIR}/deps/SDL)
add_subdirectory(${CMAKE_SOURCE_DIR}/deps/SDL_image)
add_subdirectory(${CMAKE_SOURCE_DIR}/deps/SDL_mixer)
add_subdirectory(${CMAKE_SOURCE_DIR}/deps/SDL_net)
add_subdirectory(${CMAKE_SOURCE_DIR}/deps/SDL_ttf)
       
# I prefer to group all the include folders into one variable
set(SDL3_INCLUDES ${CMAKE_SOURCE_DIR}/deps/SDL/include 
${CMAKE_SOURCE_DIR}/deps/SDL_image/include 
${CMAKE_SOURCE_DIR}/deps/SDL_mixer/include 
${CMAKE_SOURCE_DIR}/deps/SDL_net/include 
${CMAKE_SOURCE_DIR}/deps/SDL_ttf/include)
        
# Includes

target_include_directories(${PROJECT_NAME} PRIVATE src ${SDL3_INCLUDES})
    
# Linkage
target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_BINARY_DIR}/deps/SDL/libSDL3.dll.a 
${CMAKE_BINARY_DIR}/deps/SDL_image/libSDL3_image.dll.a 
${CMAKE_BINARY_DIR}/deps/SDL_mixer/libSDL3_mixer.dll.a 
${CMAKE_BINARY_DIR}/deps/SDL_net/libSDL3_net.dll.a 
${CMAKE_BINARY_DIR}/deps/SDL_ttf/libSDL3_ttf.dll.a)
    
© www.soinside.com 2019 - 2024. All rights reserved.