В общем, решил использовать для своего проекта CMake. В проекте использую SDL2 и SDL2_image (там еще подтянется SDL2_mixer), начал гуглить, как все это слинковать. Сначала я удивился, что CMake из коробки не может подтянуть SDL2-библиотеки, только SDL, потом нашел репозиторий с FindSDL2*.cmake. Окей, склонировал все в корень проекта в cmake/sdl2/
. Написал вот такой CMakeLists.txt
:
cmake_minimum_required(VERSION 3.10)
project(prototype)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)
add_executable(${PROJECT_NAME} main.c)
target_include_directories(${PROJECT_NAME} PRIVATE graphics)
find_package(SDL2 REQUIRED)
target_link_libraries(${PROJECT_NAME} SDL2::Main)
find_package(SDL2_image REQUIRED)
target_link_libraries(${PROJECT_NAME} SDL2::Image)
Валится с:
> cmake -S . -B build
CMake Error at cmake/sdl2/FindSDL2.cmake:243 (message):
Could NOT find Threads (Threads is required by SDL2).
Call Stack (most recent call first):
CMakeLists.txt:11 (find_package)
-- Configuring incomplete, errors occurred!
На вот этом if:
...
if(NOT APPLE)
find_package(Threads QUIET)
if(NOT Threads_FOUND)
set(SDL2_THREADS_NOT_FOUND "Could NOT find Threads (Threads is required by SDL2).")
if(SDL2_FIND_REQUIRED)
message(FATAL_ERROR ${SDL2_THREADS_NOT_FOUND})
else()
if(NOT SDL2_FIND_QUIETLY)
message(STATUS ${SDL2_THREADS_NOT_FOUND})
endif()
return()
endif()
unset(SDL2_THREADS_NOT_FOUND)
endif()
endif()
...
Как я понял, он не может найти pthread. Решил, добавить add_compile_options(-lpthread)
также валится.
Заметил, что find /lib -name "*pthread"
ничего не выводит, но тестовая сборка с gcc main.c -pthread
отрабатывает нормально.
Также я пробовал добавлять set(THREADS_PREFER_PTHREAD_FLAG TRUE)
и в мой CMakeLists.txt
и в cmake/sdl2/FindSDL2.cmake
, но оно тоже не помогало
Почему cmake не может собрать проект? Что я делаю не так?
Решение
Заменить find_package
на find_library
таким образом:
- find_package(SDL2 REQUIRED)
- target_link_libraries(${PROJECT_NAME} SDL2::Main)
+ find_library(SDL2_LIBRARY NAMES SDL2)
+ target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARY})
- find_package(SDL2_image REQUIRED)
- target_link_libraries(${PROJECT_NAME} SDL2::Image)
+ find_library(SDL2_IMAGE_LIBRARY NAMES SDL2_image)
+ target_link_libraries(${PROJECT_NAME} ${SDL2_IMAGE_LIBRARY})