Pull to refresh

Comments 24

Веселее настроить cmake под android, там всякие fetch content могут не работать.

на сколько помню в андроид студио запускается Симейк сборка или .mk (это в сдл2-3 по крайней мере)

Они начали активно поддерживать и обновлять версию CMake в SDK в последнее время, но на сколько хорошо это работает - не проверял.

<library_target> - это цель, которую создала библиотека. Её можно найти в примерах использования библиотеки, в README.md (там вообще можно много найти) или в CMakeLists.txt. В последнем случае надо искать строки вида add_library(<library_target> ...).

Есть ли где-нибудь набор полезных советов на эту тему?

Не раз уже сталкивался с ситуациями, что то, что надо указать в качестве library_target, почему-то не соответствует тому, что приводится в readme (возможно, там информация просто устаревшая), и приходится гуглить, как именно подключить библиотеку в CMakeLists.txt. И даже это не всегда помогает - зачастую находятся советы и примеры использования только 10-летней давности, которые уже не работают.

Причем, бывает, что под Linux всё собирается, а под Windows в MSVC нет.

Скрытый текст

главный симейк собирающий таргеты

Скрытый текст
cmake_minimum_required(VERSION 3.5)
set (CMAKE_CXX_STANDARD 23)

project(opengl4-tutorial) # "Solution" name
#add_subdirectory(third_party)
add_library(glm INTERFACE)

add_library(stb_truetype STATIC)

add_library(stb_image_write STATIC)

add_library(stb_image STATIC)

add_library(WTMath STATIC)

add_library(lua STATIC)

add_library(sqlite3 STATIC)

# target_include_directories(sqlite3 INTERFACE sqlite3)

target_include_directories(lua INTERFACE lua)

target_include_directories(glm INTERFACE glm)

target_include_directories(WTMath INTERFACE WTMath)

target_sources(sqlite3 PRIVATE 
    third_party/sqlite3/sqlite3.h
    third_party/sqlite3/sqlite3.c
    third_party/sqlite3/sqlite3ext.h
    )
target_include_directories(sqlite3 PUBLIC sqlite3)

target_sources(stb_image PRIVATE 
    third_party/stb_image/stb_image.h
    third_party/stb_image/stb_image.cc
    )
target_include_directories(stb_image PUBLIC stb_image)

target_sources(stb_image_write PRIVATE 
    third_party/stb_image_write/stb_image_write.h
    third_party/stb_image_write/stb_image_write.cc
    )
target_include_directories(stb_image_write PUBLIC stb_image_write)

target_sources(stb_truetype PRIVATE 
    third_party/stb_truetype/stb_truetype.h
    third_party/stb_truetype/stb_truetype.cc
    )
target_include_directories(stb_truetype PUBLIC stb_truetype)

target_sources(WTMath PRIVATE 
    third_party/WTMath/WTMath.h
    third_party/WTMath/WTMath.c
    )
target_include_directories(WTMath PUBLIC WTMath)

target_sources(lua PRIVATE
third_party/lua/src/lapi.c
third_party/lua/src/lapi.h
third_party/lua/src/lauxlib.c
third_party/lua/src/lauxlib.h
third_party/lua/src/lbaselib.c
third_party/lua/src/lcode.c
third_party/lua/src/lcode.h
third_party/lua/src/lcorolib.c
third_party/lua/src/lctype.c
third_party/lua/src/lctype.h
third_party/lua/src/ldblib.c
third_party/lua/src/ldebug.c
third_party/lua/src/ldebug.h
third_party/lua/src/ldo.c
third_party/lua/src/ldo.h
third_party/lua/src/ldump.c
third_party/lua/src/lfunc.c
third_party/lua/src/lfunc.h
third_party/lua/src/lgc.c
third_party/lua/src/lgc.h
third_party/lua/src/linit.c
third_party/lua/src/liolib.c
third_party/lua/src/ljumptab.h
third_party/lua/src/llex.c
third_party/lua/src/llex.h
third_party/lua/src/llimits.h
third_party/lua/src/lmathlib.c
third_party/lua/src/lmem.c
third_party/lua/src/lmem.h
third_party/lua/src/loadlib.c
third_party/lua/src/lobject.c
third_party/lua/src/lobject.h
third_party/lua/src/lopcodes.c
third_party/lua/src/lopcodes.h
third_party/lua/src/lopnames.h
third_party/lua/src/loslib.c
third_party/lua/src/lparser.c
third_party/lua/src/lparser.h
third_party/lua/src/lprefix.h
third_party/lua/src/lstate.c
third_party/lua/src/lstate.h
third_party/lua/src/lstring.c
third_party/lua/src/lstring.h
third_party/lua/src/lstrlib.c
third_party/lua/src/ltable.c
third_party/lua/src/ltable.h
third_party/lua/src/ltablib.c
third_party/lua/src/ltm.c
third_party/lua/src/ltm.h
third_party/lua/src/lua.c
third_party/lua/src/luac.c
third_party/lua/src/luaconf.h
third_party/lua/src/lua.h
third_party/lua/src/lua.hpp
third_party/lua/src/lualib.h
third_party/lua/src/lundump.c
third_party/lua/src/lundump.h
third_party/lua/src/lutf8lib.c
third_party/lua/src/lvm.c
third_party/lua/src/lvm.h
third_party/lua/src/lzio.c
third_party/lua/src/lzio.h
# Makefile
    
)
target_include_directories(lua PUBLIC lua)

# assimp
set(ASSIMP_DIR "third_party/assimp")

set(BUILD_SHARED_LIBS OFF)
set(ASSIMP_BUILD_TESTS OFF CACHE INTERNAL "Build the ASSIMP test programs")
set(ASSIMP_BUILD_ASSIMP_TOOLS OFF CACHE INTERNAL "Build the ASSIMP tools")
set(ASSIMP_NO_EXPORT OFF CACHE INTERNAL "Disable ASSIMP Export")
set(ASSIMP_BUILD_COLLADA_IMPORTER ON)
set(ASSIMP_BUILD_FBX_IMPORTER ON)
# set(ASSIMP_BUILD_COLLADA_EXPORTER ON)
# set(ASSIMP_BUILD_FBX_EXPORTER ON)
set(ASSIMP_BUILD_AMF_IMPORTER OFF)
set(ASSIMP_BUILD_3DS_IMPORTER ON)
set(ASSIMP_BUILD_AC_IMPORTER OFF)
set(ASSIMP_BUILD_ASE_IMPORTER OFF)
set(ASSIMP_BUILD_ASSBIN_IMPORTER OFF)
set(ASSIMP_BUILD_B3D_IMPORTER OFF)
set(ASSIMP_BUILD_BVH_IMPORTER OFF)
set(ASSIMP_BUILD_DXF_IMPORTER OFF)
set(ASSIMP_BUILD_CSM_IMPORTER OFF)
set(ASSIMP_BUILD_HMP_IMPORTER OFF)
set(ASSIMP_BUILD_IRRMESH_IMPORTER OFF)
set(ASSIMP_BUILD_IRR_IMPORTER OFF)
set(ASSIMP_BUILD_LWO_IMPORTER OFF)
set(ASSIMP_BUILD_LWS_IMPORTER OFF)
set(ASSIMP_BUILD_MD2_IMPORTER OFF)
set(ASSIMP_BUILD_MD3_IMPORTER OFF)
set(ASSIMP_BUILD_MD5_IMPORTER OFF)
set(ASSIMP_BUILD_MDC_IMPORTER OFF)
set(ASSIMP_BUILD_MDL_IMPORTER OFF)
set(ASSIMP_BUILD_NFF_IMPORTER OFF)
set(ASSIMP_BUILD_NDO_IMPORTER OFF)
set(ASSIMP_BUILD_OFF_IMPORTER OFF)
set(ASSIMP_BUILD_OBJ_IMPORTER ON)
# set(ASSIMP_BUILD_OBJ_EXPORTER ON)
set(ASSIMP_BUILD_OGRE_IMPORTER OFF)
set(ASSIMP_BUILD_OPENGEX_IMPORTER OFF)
set(ASSIMP_BUILD_PLY_IMPORTER OFF)
set(ASSIMP_BUILD_MS3D_IMPORTER OFF)
set(ASSIMP_BUILD_COB_IMPORTER OFF)
set(ASSIMP_BUILD_BLEND_IMPORTER OFF)
set(ASSIMP_BUILD_IFC_IMPORTER OFF)
set(ASSIMP_BUILD_XGL_IMPORTER OFF)
set(ASSIMP_BUILD_Q3D_IMPORTER OFF)
set(ASSIMP_BUILD_Q3BSP_IMPORTER OFF)
set(ASSIMP_BUILD_RAW_IMPORTER OFF)
set(ASSIMP_BUILD_SIB_IMPORTER OFF)
set(ASSIMP_BUILD_SMD_IMPORTER OFF)
set(ASSIMP_BUILD_STL_IMPORTER OFF)
set(ASSIMP_BUILD_TERRAGEN_IMPORTER OFF)
set(ASSIMP_BUILD_3D_IMPORTER OFF)
set(ASSIMP_BUILD_X_IMPORTER OFF)
set(ASSIMP_BUILD_X3D_IMPORTER OFF)
set(ASSIMP_BUILD_GLTF_IMPORTER OFF)
set(ASSIMP_BUILD_3MF_IMPORTER OFF)
set(ASSIMP_BUILD_MMD_IMPORTER OFF)
set(ASSIMP_BUILD_STEP_IMPORTER OFF)
set(ASSIMP_BUILD_COLLADA_IMPORTER ON)
set(ASSIMP_BUILD_FBX_IMPORTER ON)
# set(ASSIMP_BUILD_COLLADA_EXPORTER ON)
# set(ASSIMP_BUILD_FBX_EXPORTER ON)
set(ASSIMP_BUILD_AMF_IMPORTER OFF)
set(ASSIMP_BUILD_3DS_EXPORTER OFF)
set(ASSIMP_BUILD_AC_EXPORTER OFF)
set(ASSIMP_BUILD_ASE_EXPORTER OFF)
set(ASSIMP_BUILD_ASSBIN_EXPORTER OFF)
set(ASSIMP_BUILD_B3D_EXPORTER OFF)
set(ASSIMP_BUILD_BVH_EXPORTER OFF)
set(ASSIMP_BUILD_DXF_EXPORTER OFF)
set(ASSIMP_BUILD_CSM_EXPORTER OFF)
set(ASSIMP_BUILD_HMP_EXPORTER OFF)
set(ASSIMP_BUILD_IRRMESH_EXPORTER OFF)
set(ASSIMP_BUILD_IRR_EXPORTER OFF)
set(ASSIMP_BUILD_LWO_EXPORTER OFF)
set(ASSIMP_BUILD_LWS_EXPORTER OFF)
set(ASSIMP_BUILD_MD2_EXPORTER OFF)
set(ASSIMP_BUILD_MD3_EXPORTER OFF)
set(ASSIMP_BUILD_MD5_EXPORTER OFF)
set(ASSIMP_BUILD_MDC_EXPORTER OFF)
set(ASSIMP_BUILD_MDL_EXPORTER OFF)
set(ASSIMP_BUILD_NFF_EXPORTER OFF)
set(ASSIMP_BUILD_NDO_EXPORTER OFF)
set(ASSIMP_BUILD_OFF_EXPORTER OFF)
set(ASSIMP_BUILD_OBJ_EXPORTER ON)
# set(ASSIMP_BUILD_OBJ_EXPORTER ON)
set(ASSIMP_BUILD_OGRE_EXPORTER OFF)
set(ASSIMP_BUILD_OPENGEX_EXPORTER OFF)
set(ASSIMP_BUILD_PLY_EXPORTER OFF)
set(ASSIMP_BUILD_MS3D_EXPORTER OFF)
set(ASSIMP_BUILD_COB_EXPORTER OFF)
set(ASSIMP_BUILD_BLEND_EXPORTER OFF)
set(ASSIMP_BUILD_IFC_EXPORTER OFF)
set(ASSIMP_BUILD_XGL_EXPORTER OFF)
set(ASSIMP_BUILD_Q3D_EXPORTER OFF)
set(ASSIMP_BUILD_Q3BSP_EXPORTER OFF)
set(ASSIMP_BUILD_RAW_EXPORTER OFF)
set(ASSIMP_BUILD_SIB_EXPORTER OFF)
set(ASSIMP_BUILD_SMD_EXPORTER OFF)
set(ASSIMP_BUILD_STL_EXPORTER OFF)
set(ASSIMP_BUILD_TERRAGEN_EXPORTER OFF)
set(ASSIMP_BUILD_3D_EXPORTER OFF)
set(ASSIMP_BUILD_X_EXPORTER OFF)
set(ASSIMP_BUILD_X3D_EXPORTER OFF)
set(ASSIMP_BUILD_GLTF_EXPORTER OFF)
set(ASSIMP_BUILD_3MF_EXPORTER OFF)
set(ASSIMP_BUILD_MMD_EXPORTER OFF)
set(ASSIMP_BUILD_STEP_EXPORTER OFF)

add_subdirectory(third_party/assimp)
target_include_directories(assimp PUBLIC "${ASSIMP_DIR}/include")
target_compile_definitions(assimp PUBLIC "ASSIMP_INCLUDE_NONE")

set(SDL_TEST_LIBRARY OFF)
set(SDL3MIXER_MIDI OFF)
set(SDL_SHARE OFF)
set(SDL_STATIC ON)
# add_subdirectory(third_party/WTMath)
add_subdirectory(third_party/SDL)
add_subdirectory(third_party/SDL_image)
add_subdirectory(third_party/SDL_ttf)
add_subdirectory(third_party/SDL_mixer)
add_subdirectory(third_party/SDL_net)
add_subdirectory(third_party/freetype-2.13.3)
# target_include_directories(freetype PUBLIC third_party/freetype-2.13.3/include)
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin")
set (EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin")
# Variables for common classes (used throughout all projects)
set(COMMON_CLASSES_ROOT "${CMAKE_SOURCE_DIR}/common_classes")
add_subdirectory(01-window)
add_subdirectory(02-first-shader)
add_subdirectory(03-first-color)
add_subdirectory(04-entering-third-dimension)
add_subdirectory(05-simple-camera)
add_subdirectory(06-texture)
add_subdirectory(07-MultiLayerTexture)
add_subdirectory(08-torus-indexed)
add_subdirectory(09-geometry-shader)
add_subdirectory(10-assimp-model)
message(STATUS "CXX Flags: " ${CMAKE_CXX_FLAGS})

симейк примера 01

Скрытый текст
cmake_minimum_required(VERSION 3.27)

set(PROJECT_NAME "01-window")
project(${PROJECT_NAME}) # Project's name
#cmake_minimum_required(VERSION 3.1) # Specify the minimum version for CMake
set (CMAKE_CXX_STANDARD 23) # Support C++14

file(GLOB TUTORIAL_001_SOURCE_FILES *.cpp)

set(COMMON_CLASSES_SOURCE_FILES
"${COMMON_CLASSES_ROOT}/OpenGLWindow.cpp"
)

set(COMMON_CLASSES_HEADER_FILES
"${COMMON_CLASSES_ROOT}/OpenGLWindow.h"
)

add_compile_options(-std=c++23 -Ofast -funroll-all-loops)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # does not produce the json file
set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "") # works

#set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin")
#set (EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin")
set (CMAKE_CXX_STANDARD 23)

# add_subdirectory(../third_party)

include_directories(../third_party/stb_image)
include_directories(../third_party/WTMath)
include_directories(../third_party/stb_image_write)
find_package(GLEW 2.0 REQUIRED)
include_directories(${GLEW_INCLUDE_DIRS})
add_executable(${PROJECT_NAME}
${TUTORIAL_001_SOURCE_FILES}
${COMMON_CLASSES_SOURCE_FILES}
${COMMON_CLASSES_HEADER_FILES}
)

add_definitions(-DGLEW_STATIC -DSDL_MAIN_HANDLED -DGLM_FORCE_DEPTH_ZERO_TO_ONE -DGLM_FORCE_RADIANS)

target_link_libraries(${PROJECT_NAME} glm stb_image pthread dl m z WTMath GLEW::GLEW GL)

target_include_directories(${PROJECT_NAME} PUBLIC ${GLEW_INCLUDE_DIRS})

target_include_directories(${PROJECT_NAME} PUBLIC ../third_party/SDL/include)
target_link_libraries(${PROJECT_NAME} SDL3-static)

target_include_directories(${PROJECT_NAME} PUBLIC ../third_party/SDL_image/include)
target_link_libraries(${PROJECT_NAME} SDL3_image-static)

target_include_directories(${PROJECT_NAME} PUBLIC ../third_party/SDL_ttf/include)
target_link_libraries(${PROJECT_NAME} SDL3_ttf-static)

target_include_directories(${PROJECT_NAME} PUBLIC ../third_party/SDL_mixer/include)
target_link_libraries(${PROJECT_NAME} SDL3_mixer-static)

target_include_directories(${PROJECT_NAME} PUBLIC ../third_party/SDL_net/include)
target_link_libraries(${PROJECT_NAME} SDL3_net-static)

Вопрос у меня был, в основном, про эти два момента:

target_include_directories(${PROJECT_NAME} PUBLIC ${GLEW_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} SDL3-static)

Как, в общем случае, догадаться при подключении сторонних библиотек, что нужно подставить в качестве ${GLEW_INCLUDE_DIRS} в target_include_directories и SDL3-static в target_link_libraries? Иногда приходится кучи вариантов чуть ли не наугад перебирать, если в README ничего не написано, либо что-то написано, но не работает.

У каких-то библиотек есть файл .cmake, у каких-то нет, и вообще возможны самые разные варианты.

понял простите, еще надо контролировать какая сборка и присутствует в имени d при дебаге или нет и помойму имя под каждый тип сборки можно настроить, но сейчас не найду покачто, видел у себя тоже например есть моменты когда от типа сборки надо хендлить имя, а при другой конфигурации у вас всегда без d допустим одинаковое имя

посмотрите на библиотеку WTMath(в тех двух скринах) я её написал и законфигурировал я вам кинул общий дизайн с настройками которые в ридми и когда вы сами написали либу

(у ассимпа например есть файл симейк там есть переменные которые управляют сборкой, если проект аля исходник линкуете его в библиотеку наверно чтото такое)

${GLEW_INCLUDE_DIRS} - либо сами определяете по типу ${COMMON_INCLUDE_ROOT}, либо она у вас есть если есть то find найдёт ее в системе по файликам симейка как я понимаю

Совет 0: пользуйтесь пакетными менеджерами. Например, vcpkg зачастую подсказывает, как использовать библиотеку.
Совет 1: ищите библиотеки через find_package. В приоритете использование cmake-конфига. Если его нет, можно попробовать встроенные в cmake find-модули. Если их нет можно попробовать pkg_check_modules (на windows тоже работает, но нужно где-то раздобыть pkgconf). Если вы, как и автор, пользуетесь FetchContent, подгоняйте своё использование под официальное (в принципе, в доках к FetchContent об этом пишут).
Совет 2: пользуйтесь экспортированными таргетами. Имена таргетов обычно указывают в документации или в примерах использования, в худшем случае можно посмотреть в cmake-конфиге.
Совет 3: пользуйтесь namespaced-таргетами.

Спасибо. Про совет 3 можно подробнее - что имеется ввиду?

Некоторые библиотеки экспортируют таргеты без namespace и с namespace. Вроде, libpng раньше экспортировал png и PNG::PNG. При использовании первого о возможной ошибке вы узнаете только во время компиляции, а при использовании второго - ещё на этапе конфигурации.

Понял. Собственно, после установки libpng с помощью vcpkg имеется файл usage:

installed\x64-windows-static\share\libpng\usage

И в нем написано, как подшивать библиотеку в CMakeLists.txt:

The package libpng is compatible with built-in CMake targets:

    find_package(PNG REQUIRED)
    target_link_libraries(main PRIVATE PNG::PNG)

Здесь вместо main лучше подставить ${PROJECT_NAME}

Но под Windows надо ещё догадаться, что нужны ещё вот такие строки:

if(WIN32)
find_path(PNG_INCLUDE_DIR PNG)
target_include_directories(${PROJECT_NAME} PRIVATE ${PNG_INCLUDE_DIR})
endif(WIN32)

И с каждой библиотекой приходится танцы с бубном устраивать, чтобы понять, что именно надо включить в CMakeLists.txt, чтобы библиотека подшилась. К сожалению, файл вроде usage есть далеко не для всех библиотек.

А еще, если библиотека не header only, она под Windows статически обычно не подшивается. Конкретно для PNG после сборки рядом с EXE-файлом ещё оказываются libpng16.dll и zlib1.dll - не подскажете, как добиться того, чтобы они статически прилинковались в исполняемый файл?

Но под Windows надо ещё догадаться, что нужны ещё вот такие строки

Не нужны. Если без этого не работает - что-то криво настроили или не почистили CMakeCache.txt.
90% ошибок из-за двух вещей:

  • Вместо использования предоставленного vcpkg тулчейна, как указано в документации, люди натравливают CMake прямо на папку vcpkg_installed.

  • При использовании тулчейна указывают его после вызова project(), то есть слишком поздно.

не подскажете, как добиться того, чтобы они статически прилинковались в исполняемый файл?

Какие библиотеки будут собираться решается триплетом.
https://learn.microsoft.com/en-us/vcpkg/concepts/triplets
В вашем случае это будет x64-windows-static или x64-windows-static-md, если ваш проект линкуется с CRT динамически.

PS: PNG с недавних пор сам экспортирует свои таргеты и это учтено в usage, обновитесь :)

Как вы верно заметили, внешние библиотеки, как правило, сводятся к двум сущностям: самой библиотеке (.dll, .so, .lib, .a, whatever) и хедерам.

Поэтому обычно требуется задать link-library и include-directories.

Такой подход чреват ошибками, поэтому примерно 10 лет назад в cmake вместо непосредственных зависимостей настоятельно рекомендуют использовать таргеты.

Суть в том, что вы описываете внешнюю либу в терминах отдельного целостного таргета. В его свойствах указываете путь к самой либе, путь к инклюдам и т.д. (вплоть до специфических ключей компиляции, которые должны быть у проекта, если он использует эту либу). Т.е. вместо ваших упражнений:

target_link_libraries(engine PRIVATE
  ${CMAKE_CURRENT_SOURCE_DIR}/lib/lib-mingw-w64/libglfw3.a)
# Or
target_link_libraries(engine PRIVATE
  ${CMAKE_CURRENT_SOURCE_DIR}/lib/lib-vc2022/glfw3.lib)

target_include_directories(engine PRIVATE 
  ${CMAKE_CURRENT_SOURCE_DIR}/include)

нынче (уж 10 лет, как) советуют делать

add_library(glfw3 STATIC IMPORTED)
set_target_properties(glfw3 PROPERTIES
  IMPORTED_LOCATION "glfw3/lib/lib-vc2022/glfw3.lib"
  INTERFACE_COMPILE_DEFINITIONS "можно ещё и опций компилятора напихать..."
  INTERFACE_INCLUDE_DIRECTORIES "glfw3/include"
)

target_link_libraries(engine PRIVATE glfw3)

Первая часть (с определением внешней либы) может быть в проекте, а может импортироваться снаружи, для этого примерно такой по сути код кладётся в файл `glfw3-config.cmake` в одно из известных мест, и затем cmake его подтягивает, когда вы говорите find_package (glfw3). По итогу в проекте у вас остаётся find_package + последующее target_link_libraries. Никаких жёстко привязанных деталей самой библиотеки нет, они живут снаружи.

Суть в том, что вы подключаете либу единственным target_link_libraries, и получаете сразу всё - и линки, и инклюды, и прочие особенности. Шансы что-то упустить исчезают.

(то же работает и для headers-only, и для shared. Просто везде нынче таргеты, а разные ручные линки/инклюды уже не комильфо).

Ну и про glob вам всё расскажет гугл/яндекс по запросу `Why cmake file GLOB evil`

Где-нибудь бы ещё писали заранее как делать и как не делать. А то приходится такие знания по крупицам собирать

Оно "где-то" периодически всплывает; больше на разных конференциях и в виде слайдов. Например, https://indico.gsi.de/event/13328/contributions/56722/attachments/37710/50573/modern_cmake_cpp_user_group_nov21_dennis_dklein.pdf
Можно ещё подобного найти по фразам "modern cmake" и подобным. Главное, на даты выхода смотреть, потому что некоторые из тех 'modern' уже давно устарели.
По версиям - это примерно закрутилось с cmake 3.14 и далее.

Моё недоумение скорее связано с непониманием, почему в документации самого CMake нет best practices и примеров использования.

Я называю этот феномен "покупайте мою книжку", потому что в той самой книге это всё есть :)
Professional CMake by Craig Scott.

Спасибо за предложение. Я постарался дополнить статью в соответствии с ним.
С выделением отдельной библиотеки я согласен, однако считаю, что GLOB не так плох как привыкли думать, особенно для маленьких проектов, поэтому я только добавил абзац о возможных минусах.

glob вполне хорош, но надо хорошо понимать, какие последствия могут вылезти в определенных случаях. И, что плохо, вылезти они могут далеко не сразу.

а если таргеты - проект - и каждый подпроект прописан в проекте глоб вроде упрощает сборку, просто эти подпроекты надо включить в перенос на гит например, но на винде я не тестил

тоесть соберутся сначала таргеты, потом начнется сборка подпроектов которые входят в проект

тогда куча файлов проекта будет кор-основой для каждого нового подпроекта

при том такая структура позволит делать бинарники на каждую стадию состояния кор основы проекта, они будут как проектики текущего состояния со своим бинарников в папке bin

тоесть велосипед состоит в том что если нужнен новый снимок состояния возможностей в новый бинарник с кодом мы пишем новый такой проектик где показываем то что хотели показать новыми написаными возможностями состояния кодовой базы. звучит тофтологично и вроде нет магии, но имеет место быть

GLOB уже давно починили, никакой проблемы его использовать нет.

у меня есть тоже на вулкане сценка - на С и на С++. я так и не понял как рендерить сцены с многими обьектами, я в этой архитектуре вулкана тупо запутался пока следовал туториалам и пытался потом вникнуть, допустим у меня есть сцена с 1 текстурой и 3 модельками, но как из этого делать рендер аля опенЖЛ пока не допираю, не удобно очень, но круто сделано

(тоесть тупо запутался в этих дескриптор пулах буферах, что куда подключать чтоб придти к функционалу загрузил модельку текстуру кинул в шейдер и управляю моделькой допустим на террене с кубмапой и прочее, а по отдельности вроде понял)

Так как Vulkan - это полноценный SDK (набор инструментов разработки), то он содержит в себе библиотеки, заголовки, документацию, примеры и инструменты. Поэтому его приходится устанавливать отдельно как программу.

Совсем не обязательно. Можно использовать volk и Vulkan-Headers.

Тогда можно будет фетчить их из Cmake, а запускаться Vulkan будет динамически, без необходимости линковки со статическими библиотеками. Работает для Linux и Windows, должно работать для Android. Как-то можно заставить работать для MacOSX но там в любом случае нужно будет возиться с MoltenVK.

К слову, Chatgpt неплохо "разбирается" в cmake. Не знаю, как пример со статьи, но свой сложный проект я в нем собрал, примерно за 8 часов мучений.

Sign up to leave a comment.

Articles