Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[cmake] Jak napisać cmake ?

Ostatnio zmodyfikowano 2025-06-15 11:31
Autor Wiadomość
pekfos
» 2025-06-07 21:03:28
# 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"
)
Jeśli już, dodaj to do PATH w systemie, nie w cmake. Nie powinieneś mieć ścieżek bezwzględnych w cmake i źródłach, chyba że dotyczą czegoś co wiadomo że istnieje zawsze (jak na przykład czcionka Arial w tym edytorze tekstowym, która jest dostarczona z Windowsem i licencja nie pozwala na jej redystrybucję).
P-182508
tBane
Temat założony przez niniejszego użytkownika
» 2025-06-07 21:04:43
W instalacji zaznaczyłem wyraźnie, żeby posiadadać SFML 2.6.2 na dysku C.
Czy reszta jest w porządku ?
P-182509
pekfos
» 2025-06-07 21:07:43
To po co się bawić w find_package? To jest po to by nie trzeba było zakładać że coś jest w konkretnej lokalizacji.
P-182510
tBane
Temat założony przez niniejszego użytkownika
» 2025-06-07 21:12:09
To w takim razie czym to zastąpić? Zaraz znajdę lokalizację czcionki w windows i pozbędę się "redystrybuowanej" :-)

// edit
done. :-)
P-182511
pekfos
» 2025-06-07 21:33:14
find_package, find_library itp dostarczają informacji gdzie znajduje się biblioteka. Przeczytaj dokumentację.
P-182512
tBane
Temat założony przez niniejszego użytkownika
» 2025-06-07 21:45:36
Nie mogę znaleźć dokumentacji ..


Could not find a package configuration file provided by "SFML" (requested
  version 2.6.2) with any of the following names:

    SFMLConfig.cmake
    sfml-config.cmake

  Add the installation prefix of "SFML" to CMAKE_PREFIX_PATH or set
  "SFML_DIR" to a directory containing one of the above files.  If "SFML"
  provides a separate development package or SDK, be sure it has been
  installed


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)

find_library(SFML 2.6.2)
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"
)
P-182513
tBane
Temat założony przez niniejszego użytkownika
» 2025-06-07 22:35:07
dobra zostawiam tak..

cmake_minimum_required(VERSION 3.10)
project(EasyNotepad VERSION 2.0)

# Źródła
add_executable(${PROJECT_NAME} EasyNotepad/main.cpp)

target_sources(${PROJECT_NAME} PRIVATE
    EasyNotepad/SFML_intro.hpp
)

# Ustawienia języka C++
set_target_properties(${PROJECT_NAME} PROPERTIES
  CXX_STANDARD 17
  CXX_STANDARD_REQUIRED ON
)

target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)

# Wskaż katalog SFML, jeśli nie jest w standardowej lokalizacji
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ć ich ręcznie
set_target_properties(${PROJECT_NAME} PROPERTIES
    VS_DEBUGGER_ENVIRONMENT "PATH=%PATH%;C:\\SFML-2.6.2\\bin"
)
P-182514
nanoant20
» 2025-06-08 14:09:05
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
C/C++
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ę.
P-182515
1 2 « 3 » 4 5
Poprzednia strona Strona 3 z 5 Następna strona