c++ - 在Ubuntu上使用C++和cmake使用SDL2 + SDL2Image加载PNG

标签 c++ linux cmake sdl-2

我正在从这里制作一个简单的教程:https://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php

我的初始程序未加载任何图像。它只是显示一个屏幕而消失了。一切正常。这是我的初始CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.7)
project(01_hello_world)


set(CXX_STANDARD 17)

find_package(SDL2 REQUIRED)

add_executable(hello 01_hello_SDL.cpp)
target_include_directories(hello PRIVATE ${SDL2_INCLUDE_DIRS})
target_link_libraries(hello ${SDL2_LIBRARIES})

一切正常,编译正常。但是,然后我想加载一个PNG图像,我认为这很容易。谷歌搜索使我进入了SDL2图像库和IMG_Load方法。所以我继续安装libsdl2-image-dev,我的CMakeLists.txt文件又增加了两行:
set(SDL2IMAGE_INCLUDE_DIRS ${SDL2_INCLUDE_DIRS})
set(SDL2IMAGE_LIBRARIES "/usr/lib/x86_64-linux-gnu/libSDL2_image.a")

但是,仅通过使用IMG_Load方法,make命令就产生了很多库需求:libtiff-devlibpng-devlibjpeg-devlibwebp-dev。所有这些只是为了加载png文件!因此,我继续安装了所有这些文件,现在我的CMakeLists.txt文件看起来像是可憎的(我在可能的地方使用了find_package,并在不能的地方手动设置了变量):
cmake_minimum_required(VERSION 3.7)
project(01_hello_world)

set(CXX_STANDARD 17)

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
find_package(SDL2 REQUIRED)
find_package(PNG REQUIRED)
find_package(JPEG REQUIRED)
find_package(TIFF REQUIRED)

set(SDL2IMAGE_INCLUDE_DIRS ${SDL2_INCLUDE_DIRS})
set(SDL2IMAGE_LIBRARIES "/usr/lib/x86_64-linux-gnu/libSDL2_image.a")
set(WEBP_LIBRARIES "/usr/lib/x86_64-linux-gnu/libwebp.a")

add_executable(hello 01_hello_SDL.cpp)
target_include_directories(hello PRIVATE ${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIRS} ${PNG_INCLUDE_DIRS})
target_link_libraries(hello ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES} ${PNG_LIBRARY} ${JPEG_LIBRARY} ${WEBP_LIBRARIES} ${TIFF_LIBRARIES} Threads::Threads)

在这一点上,当我做的时候,我得到这个错误:
[ 50%] Linking CXX executable hello
/usr/bin/ld: cannot find -l{TIFF_LIBRARIES}
collect2: error: ld returned 1 exit status
CMakeFiles/hello.dir/build.make:98: recipe for target 'hello' failed
make[2]: *** [hello] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/hello.dir/all' failed
make[1]: *** [CMakeFiles/hello.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

我已经搜寻了几个小时。有人可以在黑暗中提供光明吗?

这也是使用sdl + cmake的正确方法吗?

最佳答案

set(SDL2IMAGE_LIBRARIES "/usr/lib/x86_64-linux-gnu/libSDL2_image.a")

似乎您没有将SDL2_image动态链接到您的程序。
我不知道如何在CMake中进行更改,但是您可以使用以下模式来编译程序:
g++ your_program.cpp -o your_program -lSDL2 -lSDL2_image

您也可以像这样使用Makefile:
OBJS = your_program.cpp

OBJ_NAME = your_program_output

all:
    g++ $(OBJS) -o $(OBJ_NAME) -lSDL2 -lSDL2_image # don't forget about replacing the four spaces by a tab character

最后一件事,lazy foo上有一个教程,教如何在Linux上使用或不使用IDE(代码:: Blocks)(命令行和Makefiles)来安装和设置SDL2_image库。
http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/linux/index.php

关于c++ - 在Ubuntu上使用C++和cmake使用SDL2 + SDL2Image加载PNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62127765/

相关文章:

c++ - 我应该在任何地方都使用 std::and boost::prefixes 吗?

c++ - 在类C++中的并集内初始化数组

c++ - 如何在 C++ 中将带有空格的单词分成两列

c# - 由于缺少许可证,无法构建 Brew 包

mysql - 如何从mysql查询结果中删除+-----+

c++ - 解析/proc/文件是否安全?

gcc - CMake 获取依赖头文件,如 gcc -M

c++ - VS2005 : How to compile projects as if it was VS6?

c++ - 用于 C++ 的类型安全构建系统(类似于 SBT)

c++ - cmake 在添加的可执行文件中使用库目标