Ошибка линковщика при попытке подключить SDL2 на Linux + cmake
Собрал и установил SDL 2 из исходников с официального сайта.
./configure
make
sudo make install
После этого пытаюсь подключить его в своём cmake проекте, но линовщик даёт ошибку unrecognized option '--enable-new-dtags -lSDL2'.
cmake_minimum_required(VERSION 3.20)
project(sdl_test LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(SDL2 REQUIRED)
include_directories(${PROJECT_NAME} ${SDL2_INCLUDE_DIRS})
link_directories(${PROJECT_NAME} ${SDL2_LIBRARIES})
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES})
Пробовал собирать при помощи gcc-11 и clang-13.
Ubuntu 21.10, gcc-11, clang-13, cmake 3.20 (пробовал генераторы make и ninja).
upd: после этого дополнительно поставил различные части sdl из репозиториев, это не помогло.
sudo apt install libghc-sdl2-dev libsdl2-2.0-0 libsdl2-dev libsdl2-image-2.0-0 libsdl2-image-dev libsdl2-mixer-2.0-0 libsdl2-mixer-dev libsdl2-net-2.0-0 libsdl2-ttf-2.0-0 libsdl2-ttf-dev
upd2: Сборка проекта с make VERBOSE=1
make VERBOSE=1
/usr/local/bin/cmake -S/home/riv/mainProjects/cpp_test -B/home/riv/mainProjects/cpp_test --check-build-system CMakeFiles/Makefile.cmake 0
/usr/local/bin/cmake -E cmake_progress_start /home/riv/mainProjects/cpp_test/CMakeFiles /home/riv/mainProjects/cpp_test//CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/riv/mainProjects/cpp_test'
make -f CMakeFiles/sdl_test.dir/build.make CMakeFiles/sdl_test.dir/depend
make[2]: Entering directory '/home/riv/mainProjects/cpp_test'
cd /home/riv/mainProjects/cpp_test && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" /home/riv/mainProjects/cpp_test /home/riv/mainProjects/cpp_test /home/riv/mainProjects/cpp_test /home/riv/mainProjects/cpp_test /home/riv/mainProjects/cpp_test/CMakeFiles/sdl_test.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/home/riv/mainProjects/cpp_test'
make -f CMakeFiles/sdl_test.dir/build.make CMakeFiles/sdl_test.dir/build
make[2]: Entering directory '/home/riv/mainProjects/cpp_test'
[100%] Building CXX object CMakeFiles/sdl_test.dir/main.cpp.o
/usr/bin/c++ -I/home/riv/mainProjects/cpp_test/sdl_test -I/usr/local/include/SDL2 -std=gnu++17 -MD -MT CMakeFiles/sdl_test.dir/main.cpp.o -MF CMakeFiles/sdl_test.dir/main.cpp.o.d -o CMakeFiles/sdl_test.dir/main.cpp.o -c /home/riv/mainProjects/cpp_test/main.cpp
[100%] Linking CXX executable sdl_test
/usr/local/bin/cmake -E cmake_link_script CMakeFiles/sdl_test.dir/link.txt --verbose=1
/usr/bin/c++ CMakeFiles/sdl_test.dir/main.cpp.o -o sdl_test -L/home/riv/mainProjects/cpp_test/sdl_test -L"/home/riv/mainProjects/cpp_test/-L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,--enable-new-dtags -lSDL2" -Wl,-rpath,"/home/riv/mainProjects/cpp_test/sdl_test:/home/riv/mainProjects/cpp_test/-L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,--enable-new-dtags -lSDL2" -L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,--enable-new-dtags -lSDL2
/usr/bin/ld: unrecognized option '--enable-new-dtags -lSDL2'
/usr/bin/ld: use the --help option for usage information
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/sdl_test.dir/build.make:97: sdl_test] Error 1
make[2]: Leaving directory '/home/riv/mainProjects/cpp_test'
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/sdl_test.dir/all] Error 2
make[1]: Leaving directory '/home/riv/mainProjects/cpp_test'
make: *** [Makefile:91: all] Error 2
Ответы (1 шт):
link_directories(${PROJECT_NAME} ${SDL2_LIBRARIES})
Эта строчка лишняя: ты пытаешься вместо каталогов с библиотеками для линковки подсунуть флаги линковки, что сильно смущает линкер. Указывать её не обязательно т.к. в config-модуле для find_package(), который идёт в комплекте с sdl2, SDL2_LIBRARIES уже включает путь до библиотек для линкера (флаг -L...), так что эту строчку можно просто опустить.
Если хочется явно указать путь до библиотек, то он задаётся в переменной SDL2_LIBDIR:
link_directories(${SDL2_LIBDIR})
Также, не ошибка, но в link_directories и include_directories не надо передавать каталог ${PROJECT_NAME} (если такого каталога с инклюдами на самом деле нет).