我正在从这里制作一个简单的教程: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-dev
,libpng-dev
,libjpeg-dev
和libwebp-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/