tBane Temat założony przez niniejszego użytkownika |
[cmake] Jak napisać cmake ? » 2025-04-29 20:08:52 Cześć. Mam projekt składający się z wielu plików oraz korzystający z biblioteki SFML 2.6.2. Chciałbym zbudować taki build, który po uruchomieniu stworzy mi pliki projektu Visual Studio 2022 i załączy bibliotekę. Jak to zrobić ? Przykładowe pliki SFML-2.6.2 main.cpp headers\NatureObject.hpp headers\Buildings.hpp |
|
pekfos |
» 2025-04-29 21:33:32 Po co cmake jak masz cały program w jednym pliku? Przeczytaj jakiś tutorial, wystarczy pewnie project(), add_executable(), include_directories(), link_directories() i target_link_libraries(). |
|
nanoant20 |
» 2025-04-29 21:49:35 musi określi wersję CMake , standard c++ z jakiego będzię korzystał. Określić, czy używa bibliotek statycznych czy dynamicznych, dodać scieżkę do SFML, czy projekt ma być w wersji Release czy Debug, wskazać źródła, skopiować plik z katalogu np assets do katalogu w którym będzie budował. Linkować biblioteki SFML. Jeżeli będzie używał bibliotek dynamicznych to może je też skopiować do katalogu w którym będzie budował. Chyba że ma dodane biblioteki SFML do zmiennej środowiskowej PATH wtedy CMake będzie wiedział, gdzie szukać plików konfiguracyjnych SFML trochę tego do ogarnięcia jest https://cmake.org/cmake/help/book/mastering-cmake/cmake/Help/guide/tutorial/index.html i jeszcze będzie trzeba ogarnąć jak to zrobić z cl.exe, ponieważ jest widoczny tylko z Developer Command Prompt
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-04-30 12:15:42 Na razie mam coś takiego. Co myślicie? Jak dodać foldery wraz z plikami ? assets/natures/tree9.png assets/natures/tree9.msh
assets/natures/rock1.png assets/natures/rock1.msh
cmake_minimum_required(VERSION 3.15)
# set the project name and version project(EditorRPG2D VERSION 1.0)
# set the C++ standard add_library(EditorRPG2D_compiler_flags INTERFACE) target_compile_features(EditorRPG2D_compiler_flags INTERFACE cxx_std_20)
# add the headers for project file(GLOB_RECURSE EditorRPG2D_HEADERS "headers/*.hpp")
|
|
nanoant20 |
» 2025-04-30 14:53:04 Jak dodać foldery wraz z plikami ? w dokumentacji CMake file(COPY [...]) https://cmake.org/cmake/help/latest/command/file.html file({COPY | INSTALL} <file>... DESTINATION <dir> [...]) czyli dla fazy budowania file(COPY <file-or-directory>... DESTINATION <dir>) file(COPY [...]) działa rekurencyjnie — oznacza to, że kopiuje cały katalog wraz z jego podkatalogami i zawartością, zachowując strukturę |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-04-30 18:34:52 Ok. Dziękuję :-) |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-05-26 16:48:35 Cześć. Napisałem takie CMake, ale czy da się to jakoś uprościć tzn. kopiowanie plików - coś na zasadzie pętli ? No i jeszcze pytanko. Jak rozdzielić dll dla debug/release (tzn w Release dodać tylko dll dla release a dla Debug dodać tylko debug dll), bo zbiorczo mi kopiuje ? # 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") # Zmień ścieżkę na Twoją! 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 folder add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/arial.ttf ${CMAKE_BINARY_DIR} )
# copy files to release/debug (DLLs, font etc.) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/openal32.dll ${CMAKE_BINARY_DIR}/$<CONFIG> COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-audio-2.dll ${CMAKE_BINARY_DIR}/$<CONFIG> COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-audio-d-2.dll ${CMAKE_BINARY_DIR}/$<CONFIG> COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-graphics-2.dll ${CMAKE_BINARY_DIR}/$<CONFIG> COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-graphics-d-2.dll ${CMAKE_BINARY_DIR}/$<CONFIG> COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-system-2.dll ${CMAKE_BINARY_DIR}/$<CONFIG> COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-system-d-2.dll ${CMAKE_BINARY_DIR}/$<CONFIG> COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-window-2.dll ${CMAKE_BINARY_DIR}/$<CONFIG> COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-window-d-2.dll ${CMAKE_BINARY_DIR}/$<CONFIG> COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/arial.ttf ${CMAKE_BINARY_DIR}/$<CONFIG> )
|
|
DejaVu |
» 2025-05-26 17:54:17 ChatGPT 4o: W wątku na forum cpp0x.pl dotyczącym konfiguracji CMake dla projektu z biblioteką SFML, użytkownik tBane pyta o uproszczenie kopiowania plików oraz o sposób rozdzielenia bibliotek DLL dla wersji Debug i Release. Oto kilka sugestii, które mogą pomóc:
---
### 📁 Uproszczenie kopiowania plików
Zamiast powtarzać polecenia `add_custom_command` dla każdego pliku, można wykorzystać pętlę w CMake do iteracyjnego kopiowania plików. Przykład:
```cmake # Lista plików do skopiowania set(ASSETS arial.ttf openal32.dll sfml-audio-2.dll sfml-audio-d-2.dll )
# Iteracyjne kopiowanie plików foreach(ASSET ${ASSETS}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/${ASSET} ${CMAKE_BINARY_DIR}/$<CONFIG> ) endforeach() ```
Jeśli chcesz skopiować cały katalog (np. `assets/`), możesz użyć:
```cmake add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/assets ${CMAKE_BINARY_DIR}/$<CONFIG>/assets ) ```
---
### 🧩 Rozdzielenie DLL dla Debug i Release
Aby uniknąć kopiowania wszystkich plików DLL do obu konfiguracji, możesz użyć generatora `$<CONFIG>` oraz warunków `if` w CMake:
```cmake # Kopiowanie plików specyficznych dla konfiguracji if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(DLLS sfml-audio-d-2.dll) elseif(CMAKE_BUILD_TYPE STREQUAL "Release") set(DLLS sfml-audio-2.dll) endif()
foreach(DLL ${DLLS}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/EasyNotepad/${DLL} ${CMAKE_BINARY_DIR}/$<CONFIG> ) endforeach() ```
Alternatywnie, możesz użyć funkcji `target_sources` i `target_link_libraries` z generatorami `$<$<CONFIG:Debug>:...>` i `$<$<CONFIG:Release>:...>` do dodawania plików i bibliotek specyficznych dla konfiguracji.
---
### ✅ Dodatkowe wskazówki
* Upewnij się, że zmienna `CMAKE_BUILD_TYPE` jest ustawiona, np. przez `-DCMAKE_BUILD_TYPE=Release` podczas konfiguracji CMake. * Rozważ użycie `install()` i `CMakeLists.txt` w połączeniu z `CMake` do zarządzania kopiowaniem plików i instalacją projektu.
Jeśli potrzebujesz bardziej zaawansowanej konfiguracji lub masz dodatkowe pytania, daj znać!
|
|
« 1 » 2 3 4 5 |