[cmake] Jak napisać cmake ?
Ostatnio zmodyfikowano 2025-06-15 11:31
tBane Temat założony przez niniejszego użytkownika |
» 2025-05-26 18:18:19 Ok. Dzięki :-) Mam taki kod: # min version CMake cmake_minimum_required(VERSION 3.10)
# project name project(EasyNotepad)
# set the standard C++ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True)
# add the executable add_executable(${PROJECT_NAME} EasyNotepad/main.cpp)
# find SFML set(SFML_DIR "C:/SFML-2.6.2/lib/cmake/SFML") find_package(SFML 2.6.2 COMPONENTS graphics window system REQUIRED)
# link SFML libraries target_link_libraries(${PROJECT_NAME} sfml-graphics sfml-window sfml-system)
# copy files to projects folders
set(ASSETS arial.ttf )
set(DEBUG_DLLS libs/sfml-graphics-d-2.dll libs/sfml-system-d-2.dll libs/sfml-window-d-2.dll )
set(RELEASE_DLLS libs/sfml-graphics-2.dll libs/sfml-system-2.dll libs/sfml-window-2.dll )
# copy files to Release foreach(ASSET ${RELEASE_DLLS}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/Release COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/${ASSET} ${CMAKE_BINARY_DIR}/Release COMMENT "Copying ${ASSET} to Release folder" VERBATIM CONFIGURATIONS Release ) endforeach()
# copy files to Debug foreach(ASSET ${DEBUG_DLLS}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/Debug COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/${ASSET} ${CMAKE_BINARY_DIR}/Debug COMMENT "Copying ${ASSET} to Debug folder" VERBATIM CONFIGURATIONS Debug ) endforeach()
# copy Assets foreach(ASSET ${ASSETS}) foreach(CONFIG_TYPE Debug Release) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/${ASSET} ${CMAKE_BINARY_DIR}/${CONFIG_TYPE} COMMENT "Copying ${ASSET} to ${CONFIG_TYPE} folder" VERBATIM CONFIGURATIONS ${CONFIG_TYPE} ) endforeach() endforeach()
# set the Debugger Working Directory in Visual Studio (Debug/Release) set_target_properties(${PROJECT_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIG>" )
|
|
nanoant20 |
» 2025-05-26 23:24:41 # set the standard C++ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True)
powyższe dwie linijki mogą nie działać poprawnie w przypadku MSVC, a konkretnie jeżeli użyjesz CMake'a z generatora Visual Studio Rekomendowane jest używać : set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON )
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-05-27 18:54:20 ok. poprawione # min version CMake cmake_minimum_required(VERSION 3.10)
# project name project(EasyNotepad)
# add the executable add_executable(${PROJECT_NAME} EasyNotepad/main.cpp)
# set the standard C++ (after defining the target) set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON )
# compile features target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
# find SFML set(SFML_DIR "C:/SFML-2.6.2/lib/cmake/SFML") find_package(SFML 2.6.2 COMPONENTS graphics window system REQUIRED)
# link SFML libraries target_link_libraries(${PROJECT_NAME} sfml-graphics sfml-window sfml-system)
# copy files to project folders set(ASSETS arial.ttf )
set(DEBUG_DLLS libs/sfml-graphics-d-2.dll libs/sfml-system-d-2.dll libs/sfml-window-d-2.dll )
set(RELEASE_DLLS libs/sfml-graphics-2.dll libs/sfml-system-2.dll libs/sfml-window-2.dll )
# copy files to Release foreach(ASSET ${RELEASE_DLLS}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/Release COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/${ASSET} ${CMAKE_BINARY_DIR}/Release COMMENT "Copying ${ASSET} to Release folder" VERBATIM CONFIGURATIONS Release ) endforeach()
# copy files to Debug foreach(ASSET ${DEBUG_DLLS}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/Debug COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/${ASSET} ${CMAKE_BINARY_DIR}/Debug COMMENT "Copying ${ASSET} to Debug folder" VERBATIM CONFIGURATIONS Debug ) endforeach()
# copy Assets foreach(ASSET ${ASSETS}) foreach(CONFIG_TYPE Debug Release) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/${ASSET} ${CMAKE_BINARY_DIR}/${CONFIG_TYPE} COMMENT "Copying ${ASSET} to ${CONFIG_TYPE} folder" VERBATIM CONFIGURATIONS ${CONFIG_TYPE} ) endforeach() endforeach()
# set the Debugger Working Directory in Visual Studio (Debug/Release) set_target_properties(${PROJECT_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIG>" )
|
|
nanoant20 |
» 2025-05-28 09:00:10 pozostało Ci testować, jeżeli wszystko działa z Twoim oczekiwaniem, tzn. że jest o.k. Trzeba tylko mieć świadomość, że użytkownicy MSVS mogą generować pliki budowania i kompilować z IDE Visual Studio Generator CMake , Developer Command Prompt , x64 Native Tools Command Prompt i niektóre ustawienia mogą być specyficzne przy budowaniu projektu. Możesz swój przykładowy CMakeLists.txt wrzucić do któregoś z modeli LLM i poprosić żeby Ci zrewidował pod kątem zgodności z Visual Studio |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-05-28 14:57:26 Mam jeszcze jedno pytanie. Dlaczego tworzą się 3 projekty ? |
|
jankowalski25 |
» 2025-05-28 18:38:55 Dlatego, że wybierasz Visual Studio. W zależności od konkretnego środowiska, całość jest konfigurowana odrobinę inaczej. Zapewne ALL_BUILD buduje wszystko, natomiast ZERO_CHECK po prostu odpala rzeczy związane z CMake'iem (jeśli wyedytujesz plik CMakeLists.txt, to możesz odpalić ten target, żeby przeładować ustawienia). [StackOverflow] What are ALL_BUILD and ZERO_CHECK and do I need them? |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-05-28 22:02:48 Ok. Dzięki:-) |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-06-07 20:41:39 Kolega nanoant20 zwrócił mi uwagę, że źle napisałem CMakeLists.txt. Wydaje mi się, że nie powinienem kopiować plików dll do folderów Debug/ Release tylko odnosić się do biblioteki zainstalowanej w lokacji C:\SFML-2.6.2\bin. Tak samo nie powinienem kopiować plików z folderu assets tylko ustawić Working Directory. Zrobiłem to moim zdaniem poprawnie ( bo tak doradził ChatGPT :P) Dobrze napisane ? cmake_minimum_required(VERSION 3.10) project(EasyNotepad VERSION 2.0)
add_executable(${PROJECT_NAME} EasyNotepad/main.cpp)
target_sources(${PROJECT_NAME} PRIVATE EasyNotepad/SFML_intro.hpp )
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON )
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
set(SFML_DIR "C:/SFML-2.6.2/lib/cmake/SFML") find_package(SFML 2.6.2 COMPONENTS graphics window system REQUIRED) target_link_libraries(${PROJECT_NAME} sfml-graphics sfml-window sfml-system)
# Ustaw working directory na katalog z assets set_target_properties(${PROJECT_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/EasyNotepad" )
# Ustaw PATH do DLL-i SFML, by nie kopiować set_target_properties(${PROJECT_NAME} PROPERTIES VS_DEBUGGER_ENVIRONMENT "PATH=%PATH%;C:\\SFML-2.6.2\\bin" )
|
|
1 « 2 » 3 4 5 |