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ść
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>"
)
P-182408
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)
 
P-182409
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>"
)
P-182410
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
P-182411
tBane
Temat założony przez niniejszego użytkownika
» 2025-05-28 14:57:26
Mam jeszcze jedno pytanie. Dlaczego tworzą się 3 projekty ?

P-182412
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?
P-182413
tBane
Temat założony przez niniejszego użytkownika
» 2025-05-28 22:02:48
Ok. Dzięki:-)
P-182414
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"
)
P-182507
1 « 2 » 3 4 5
Poprzednia strona Strona 2 z 5 Następna strona