Nie mogę znaleźć dokumentacji ..
zabawne : https://cmake.org/cmake/help/
https://cmake.org/cmake/help/book/mastering-cmake/cmake/Help/guide/tutorial/index.html
po wpisaniu zapytania w google można znaleźć:
Samouczek CMake (Sternum IoT) : https://sternumiot.com/iot-blog/cmake-tutorial-basic-concepts-and-building-your-first-project/
Dokumentacja Microsoft Learn: https://learn.microsoft.com/pl-pl/cpp/build/customize-cmake-settings?view=msvc-170
dokumentacje dla: CLion, Android Studio, LLVM
w dokumentacji możesz znaleźć wszystko, od definiowania zmiennych, dodawania celów, określania reguł kompilacji po lokalizowanie bibliotek i nagłówków, trzeba tylko chcieć.
dalej:
jeżeli pisałem o "PATH" to mam na myśli tak jak interpretuje to @pekfos dodaje się do systemu a nie w CMakeLists.txt
W Windows 10 możesz szybko dostać się do ustawień zmiennych środowiskowych, wpisując w pasku wyszukiwania systemowego:
SystemPropertiesAdvanced
lub alternatywnie naciśnij klawisze
Win + R
, aby otworzyć okno "Uruchamianie" i wpisz komendę / polecenie :
SystemPropertiesAdvanced
dalej:
czcionka / fonty.
jeżeli chcesz używać czcionek systemowych, to najlepiej odwołać się do nich w kodzie w pliku z kodem.cpp
sf::Font font;
if( !font.loadFromFile( "C:/Windows/Fonts/arial.ttf" ) ) {
std::cerr << "Błąd podczas ładowania czcionki!" << std::endl;
return 1;
}
w innym przypadku użyj darmowej alternatywy, aby uniknąć problemów licencyjnych, wtedy możesz wrzucić sobie ją do folderu/katalogu "assets\fonts" i dystrybuować
dalej:
ponieważ nie używam MSVS od Microsoft , tylko g++ / clang , więc zademonstruje proces konfiguracji i budowania projektu dla trybu "Release" i "Debug" .
Moja konfiguracja
Microsoft Windows 10 Pro 64-bitowy
cmake 3.31.7
cmake --version
cmake version 3.26.4
g++ --version
g++ (MinGW-W64 x86_64-msvcrt-posix-seh, built by Brecht Sanders) 13.1.0
SFML-2.6.2 dla GCC 13.1.0 MinGW (SEH) - 64-bit
zakładam że jest taka struktura folderów/katalogów:
NoteV6/
|-- CMakeLists.txt
|-- EasyNotepad/
| |-- main.cpp
|── assets/
| |--fonts/
| |-- font.ttf
| |-- aletrantywna_czcionka.ttf
| GUI/
| icons/
| |-- dictionary.png
| |-- file.ico
| scrollbar/
| |-- 1.png
| |-- 2.png
| |-- X.png
| |-- itd..
uruchamiam konsole cmd z wyszukaj lub naciskam kombinacje klawisze
Win + R
i wpisuję polecenie
cmd
WAŻNE
kompilator cl.exe nie jest widoczy z konsoli "cmd"
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.
zamiast nazwy użytkownika będę używał zmiennej systemowej
%USERPROFILE%
wchodze do katalogu / folderu z projektem wydając polecenie konsoli systemowej:
cd C:\Users\%USERPROFILE%\Documents\workspace\NoteV6
tworzę folder / katalog poleceniem :
mkdir build
i wchodzę do niego, wydając polecenie :
cd build
teraz dla lepszego zrozumienia co się dzieje należy wejść do katalogu/folderu o nazwie "build" , chodzi mi o to żeby na pulpicie systemu Windows był widoczny folder / katalog "build", pownien być pusty, a obok mieć wyświetloną konsolę wiersza poleceń
cmd
w celu wizualizacji.
nie jest istotne czy będę budował najpierw w trybie Release czy Debug
wydaje w konsoli polecenie
cmake .. -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
a następnie buduję projekt wydając polecenie :
cmake --build . --config Release
robię to samo dla trybu "debug"
cmake .. -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug
cmake --build . --config Debug
w Visual Studio do sprawdzenia:
cmake -G "NMake Makefiles"
lub
cmake .. -G "Visual Studio 17 2022"
i polecenia do budowania
cmake --build . --config Release
cmake --build . --config Debug
moje logi:
dla zaciemnienia użyłem nazwy "%USERPROFILE%" w scieżce zamiast nazwy użytkownika
C:\Users\%USERPROFILE%\Documents\workspace\NoteV6\build>cmake .. -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
-- The C compiler identification is GNU 13.1.0
-- The CXX compiler identification is GNU 13.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/CodeBlocks/MinGW/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/CodeBlocks/MinGW/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found SFML 2.6.2 in C:/SFML-2.6.2/lib/cmake/SFML
-- Configuring done (4.2s)
-- Generating done (0.1s)
-- Build files have been written to: C:/Users/%USERPROFILE%/Documents/workspace/NoteV6/build
C:\Users\%USERPROFILE%\Documents\workspace\NoteV6\build>cmake --build . --config Release
[ 50%] Building CXX object CMakeFiles/EasyNotepad.dir/EasyNotepad/main.cpp.obj
[100%] Linking CXX executable Release\EasyNotepad.exe
[100%] Built target EasyNotepad
C:\Users\%USERPROFILE%\Documents\workspace\NoteV6\build>cmake .. -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug
-- Found SFML 2.6.2 in C:/SFML-2.6.2/lib/cmake/SFML
-- Configuring done (0.2s)
-- Generating done (0.1s)
-- Build files have been written to: C:/Users/%USERPROFILE%/Documents/workspace/NoteV6/build
C:\Users\%USERPROFILE%\Documents\workspace\NoteV6\build>cmake --build . --config Debug
[ 50%] Building CXX object CMakeFiles/EasyNotepad.dir/EasyNotepad/main.cpp.obj
[100%] Linking CXX executable Debug\EasyNotepad.exe
[100%] Built target EasyNotepad
w folderze/katalogu "build" utworzyły się katalogi takie m.in. jak "Debug" i "Release"
w każdym z nich mam folder / katalog o nazwie "assets" wraz z podfolerami / katalogami i plikami: EasyNotepad.exe oraz bibliotekami *sfml.dll dla "Debug" *-d-2.dll dla "Release" *-2.dll oraz biblioteka "openal32.dll". Jeżeli ktoś korzysta lub potrzebuje bbiblioteki "sfml-audio.dll" to należy to uwzględnic w "CMakeLists.txt"
oto mój przykładowy "CMakeLists.txt"
# min version CMake
cmake_minimum_required(VERSION 3.16)
# project name
project(EasyNotepad)
# set Release or Debug sources
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(SOURCES WIN32 EasyNotepad/main.cpp)
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(SOURCES EasyNotepad/main.cpp)
endif()
# add the executable
add_executable(${PROJECT_NAME} ${SOURCES})
# 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)
# set path to SFML root directorySFML
set(SFML_ROOT_DIR "C:/SFML-2.6.2")
# find SFML
set(SFML_DIR "${SFML_ROOT_DIR}/lib/cmake/SFML")
# Find SFML Library
find_package(SFML 2.6.2 COMPONENTS graphics window system REQUIRED)
# Set bin folder for SFML
set(SFML_BIN "${SFML_ROOT_DIR}/bin")
set(RELEASE_DLLS
"${SFML_BIN}/sfml-graphics-2.dll"
"${SFML_BIN}/sfml-system-2.dll"
"${SFML_BIN}/sfml-window-2.dll"
"${SFML_BIN}/openal32.dll"
)
set(DEBUG_DLLS
"${SFML_BIN}/sfml-graphics-d-2.dll"
"${SFML_BIN}/sfml-system-d-2.dll"
"${SFML_BIN}/sfml-window-d-2.dll"
"${SFML_BIN}/openal32.dll"
)
# set target folder/directory definitions for DLL libraries
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(RELEASE_DLL_DIR "${CMAKE_BINARY_DIR}/Release")
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(DEBUG_DLL_DIR "${CMAKE_BINARY_DIR}/Debug")
endif()
# link SFML libraries
target_link_libraries(${PROJECT_NAME} PRIVATE sfml-graphics sfml-window sfml-system)
# copy dll libraries depending on mode Debug or Release
if(CMAKE_BUILD_TYPE STREQUAL "Release")
# copy files to Release
file(MAKE_DIRECTORY ${RELEASE_DLL_DIR})
foreach(DLL ${RELEASE_DLLS})
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${DLL}"
"${RELEASE_DLL_DIR}"
#COMMENT "Copy ${DLL} to ${RELEASE_DLL_DIR} for Release configuration"
)
endforeach()
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
# copy files to Debug
file(MAKE_DIRECTORY ${DEBUG_DLL_DIR})
foreach(DLL ${DEBUG_DLLS})
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${DLL}"
"${DEBUG_DLL_DIR}"
#COMMENT "Copy ${DLL} to ${DEBUG_DLL_DIR} for Debug configuration"
)
endforeach()
endif()
# Copying a folder with resources, fonts, etc. to the output directory/folder
if(CMAKE_BUILD_TYPE STREQUAL "Release")
file(COPY assets DESTINATION ${CMAKE_BINARY_DIR}/Release)
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
file(COPY assets DESTINATION ${CMAKE_BINARY_DIR}/Debug)
endif()
# set working directory for Debug or Release depending on the flag
set_target_properties(${PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIG>"
)
Jeżeli coś nie zadziała w MSVS to należy modyfikować we własnym zakresie.
Proszę zauważyć , że tylko w jednym miejscu ustawiam zmienną na bibliotekę SFML
SFML_ROOT_DIR "C:/SFML-2.6.2"
używam instrukcji
if() ... elseif() ... endif()
do sprawdzenia, jaki jest bieżący typ budowania. używam
file(COPY <file-or-directory>... DESTINATION <dir>)
, działa rekurencyjnie — oznacza to, że kopiuje cały katalog wraz z jego podkatalogami i zawartością, zachowując strukturę.
Po zbudowaniu projektu:
Należy unikać testowania w środowisku produkcyjnym
W celu przetestowania, czy nie brakuje bibliotek, należy skopiować foldery / katalogi "Debug" i "Release" wraz z całą ich zawartością na czysty system
Uważam , że wyczerpująco i klarownie już nie opiszę.