我似乎无法将第 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)
至少 根据文档,使用供应商的 SDL 时,您
add_subdirectory
供应商的 SDL 目录(包含 SDL 的根 CMakeLists.txt 文件的目录),然后 target_link_libraries
到 SDL3::SDL3
。
尝试将您的
target_link_libraries(app SDL3)
更改为 target_link_libraries(app SDL3::SDL3)
。
根据我的经验,如果您使用
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)