Hur implementera wxWidgets i CMake?

Permalänk

Hur implementera wxWidgets i CMake?

Jag behöver hjälp med att implementera wxWidgets i CMake.

Jag har skapat ett projekt för CMake i Visual Studio Community.

Nu så ska jag bara få in konfgurationen här.

# CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.8) # Enable Hot Reload for MSVC compilers if supported. if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>") endif() project ("SolderingStation") # Include sub-projects. add_subdirectory ("SolderingStation")

Jag har läst denna manual: https://docs.wxwidgets.org/3.2/overview_cmake.html
Enligt den så kan jag göra det mycket enkelt för mig igenom att klistra in detta

# CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.8) # Enable Hot Reload for MSVC compilers if supported. if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>") endif() project ("SolderingStation") find_package(wxWidgets REQUIRED COMPONENTS net core base) if(wxWidgets_USE_FILE) # not defined in CONFIG mode include(${wxWidgets_USE_FILE}) endif() add_executable(myapp myapp.cpp) target_link_libraries(myapp ${wxWidgets_LIBRARIES}) # Include sub-projects. add_subdirectory ("SolderingStation")

Men detta är inte korrekt!
Det fel som jag får är:

Severity Code Description Project File Line Suppression State Details Error CMake Error at C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find wxWidgets (missing: wxWidgets_LIBRARIES wxWidgets_INCLUDE_DIRS net core base) C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake 230

Så hur ska jag applicera detta?
Jag har kompilerat wxWidgets och alla mina .lib filer finns i följande:

  • C:\C++\wxWidgets-3.2.6\lib\vc_x64_lib 64-bit

  • C:\C++\wxWidgets-3.2.6\lib\vc_lib 32-bit

Fundering
Jag tror att CMake ska vara enkelt att konfigurera. Bara klistra in några rader, sedan är det inget mera. Men tydligen så har jag problem.

Permalänk
Skrivet av heretic16:

Jag behöver hjälp med att implementera wxWidgets i CMake.

Jag har skapat ett projekt för CMake i Visual Studio Community.

Nu så ska jag bara få in konfgurationen här.

# CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.8) # Enable Hot Reload for MSVC compilers if supported. if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>") endif() project ("SolderingStation") # Include sub-projects. add_subdirectory ("SolderingStation")

Jag har läst denna manual: https://docs.wxwidgets.org/3.2/overview_cmake.html
Enligt den så kan jag göra det mycket enkelt för mig igenom att klistra in detta

# CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.8) # Enable Hot Reload for MSVC compilers if supported. if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>") endif() project ("SolderingStation") find_package(wxWidgets REQUIRED COMPONENTS net core base) if(wxWidgets_USE_FILE) # not defined in CONFIG mode include(${wxWidgets_USE_FILE}) endif() add_executable(myapp myapp.cpp) target_link_libraries(myapp ${wxWidgets_LIBRARIES}) # Include sub-projects. add_subdirectory ("SolderingStation")

Men detta är inte korrekt!
Det fel som jag får är:

Severity Code Description Project File Line Suppression State Details Error CMake Error at C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find wxWidgets (missing: wxWidgets_LIBRARIES wxWidgets_INCLUDE_DIRS net core base) C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake 230

Så hur ska jag applicera detta?
Jag har kompilerat wxWidgets och alla mina .lib filer finns i följande:

  • C:\C++\wxWidgets-3.2.6\lib\vc_x64_lib 64-bit

  • C:\C++\wxWidgets-3.2.6\lib\vc_lib 32-bit

Du måste berätta för programmet var det hittar biblioteken. Läs vad du klistrat in och se vad du behöver ändra för att programmet ska kunna ladda vad det behöver.

Permalänk
Skrivet av Det Otroliga Åbäket:

Du måste berätta för programmet var det hittar biblioteken. Läs vad du klistrat in och se vad du behöver ändra för att programmet ska kunna ladda vad det behöver.

Men ska inte Cmake automatiskt hitta detta om jag skriver

find_package(wxWidgets REQUIRED COMPONENTS net core base) if(wxWidgets_USE_FILE) # not defined in CONFIG mode include(${wxWidgets_USE_FILE}) endif() add_executable(myapp myapp.cpp) target_link_libraries(myapp ${wxWidgets_LIBRARIES})

Permalänk
Skrivet av heretic16:

Men ska inte Cmake automatiskt hitta detta om jag skriver

find_package(wxWidgets REQUIRED COMPONENTS net core base) if(wxWidgets_USE_FILE) # not defined in CONFIG mode include(${wxWidgets_USE_FILE}) endif() add_executable(myapp myapp.cpp) target_link_libraries(myapp ${wxWidgets_LIBRARIES})

Har du definierat ”${wxWidgets_LIBRARIES}” någonstans då?

Permalänk
Skrivet av Det Otroliga Åbäket:

Har du definierat ”${wxWidgets_LIBRARIES}” någonstans då?

Nej. Måste man göra sådant? Trodde att man bara klistrade in denna kod och sedan körde CMake allt per automatik.

Vi kan börja med ett enkelt exempel

find_package(wxWidgets REQUIRED COMPONENTS net core base)

Nu säger min IDE att den hittar inte wxWidgets. Jaha? Varför inte då?

Permalänk

Vet du vad!

Jag skiter i CMake för Windows. Jag kör MSBuild istället. CMake är hemskt för Windows.
Får implementera något enkelt CMake när jag konverterar projektet för Linux.

Permalänk
Skrivet av heretic16:

Nej. Måste man göra sådant? Trodde att man bara klistrade in denna kod och sedan körde CMake allt per automatik.

Vi kan börja med ett enkelt exempel

find_package(wxWidgets REQUIRED COMPONENTS net core base)

Nu säger min IDE att den hittar inte wxWidgets. Jaha? Varför inte då?

Men hur ska den veta var biblioteket finns om du inte berättar det? 🙂
Du har, vad jag förstod av ditt tidigare inlägg lagt det i en godtyckligt vald katalog på din hårddisk. Du har i praktiken två val: berätta för programmet var det hittar biblioteken det behöver, eller lägg biblioteken på ett ställe där programmet kommer att leta; exempelvis i samma katalog där programmet körs.

Permalänk
Skrivet av Det Otroliga Åbäket:

Men hur ska den veta var biblioteket finns om du inte berättar det? 🙂
Du har, vad jag förstod av ditt tidigare inlägg lagt det i en godtyckligt vald katalog på din hårddisk. Du har i praktiken två val: berätta för programmet var det hittar biblioteken det behöver, eller lägg biblioteken på ett ställe där programmet kommer att leta; exempelvis i samma katalog där programmet körs.

Men då känns det inte riktigt krossplattform. Tanken med CMake är att jag ska bara installera biblioteket, och sedan så fixar den allt annat åt mig.

Men jag tror jag får fixa CMake under Linux. För Windows verkar det vara ett riktigt dåligt verktyg.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Men då känns det inte riktigt krossplattform. Tanken med CMake är att jag ska bara installera biblioteket, och sedan så fixar den allt annat åt mig.

Men jag tror jag får fixa CMake under Linux. För Windows verkar det vara ett riktigt dåligt verktyg.

Problemet är väl att Windows inte har någon standard för hur bibliotek skall installeras? Find-rutinerna tittar kanske på några ställen men om det inte fungerar behöver cmake hjälp på traven. Det hjälper fortfarande till med att hantera biblioteken dock.

Permalänk
Datavetare
Skrivet av heretic16:

Jag behöver hjälp med att implementera wxWidgets i CMake.

Jag har skapat ett projekt för CMake i Visual Studio Community.

Nu så ska jag bara få in konfgurationen här.

# CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.8) # Enable Hot Reload for MSVC compilers if supported. if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>") endif() project ("SolderingStation") # Include sub-projects. add_subdirectory ("SolderingStation")

Jag har läst denna manual: https://docs.wxwidgets.org/3.2/overview_cmake.html
Enligt den så kan jag göra det mycket enkelt för mig igenom att klistra in detta

# CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.8) # Enable Hot Reload for MSVC compilers if supported. if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>") endif() project ("SolderingStation") find_package(wxWidgets REQUIRED COMPONENTS net core base) if(wxWidgets_USE_FILE) # not defined in CONFIG mode include(${wxWidgets_USE_FILE}) endif() add_executable(myapp myapp.cpp) target_link_libraries(myapp ${wxWidgets_LIBRARIES}) # Include sub-projects. add_subdirectory ("SolderingStation")

Men detta är inte korrekt!
Det fel som jag får är:

Severity Code Description Project File Line Suppression State Details Error CMake Error at C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find wxWidgets (missing: wxWidgets_LIBRARIES wxWidgets_INCLUDE_DIRS net core base) C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake 230

Så hur ska jag applicera detta?
Jag har kompilerat wxWidgets och alla mina .lib filer finns i följande:

  • C:\C++\wxWidgets-3.2.6\lib\vc_x64_lib 64-bit

  • C:\C++\wxWidgets-3.2.6\lib\vc_lib 32-bit

Fundering
Jag tror att CMake ska vara enkelt att konfigurera. Bara klistra in några rader, sedan är det inget mera. Men tydligen så har jag problem.

Backa ett steg och tänk efter: hur ska CMake ha någon som helst chans att lura ut var du råkar placera ett bibliotek som du själv byggt om du inte explicit talar om det?

Antar att du egentligen bara vill ha access till vxWidges. Om så gör detta om du kör Windows:

1. Installera vcpkg

$ git clone https://github.com/microsoft/vcpkg.git $ cd vcpkg $ .\bootstrap-vcpkg.bat

2. Installera vxWidges via vcpkg

.\vcpkg install wxwidgets

3. Integrera ditt CMake bygge med vcpkg
För detta skicka med detta till cmake när du skapar makefilerna

-DCMAKE_TOOLCHAIN_FILE=[path_to_vcpkg]/scripts/buildsystems/vcpkg.cmake

och ha med detta i CMake

find_package(wxWidgets REQUIRED) target_link_libraries(your_target_name PRIVATE wx::wx)

Motsvarande på Linux: om du installerade bibliotek via paket-hanterar kommer CMake 'find_package(wxWidgets REQUIRED)' använda pkg-config som kommer hitta det som behövs.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Skrivet av Elgot:

Problemet är väl att Windows inte har någon standard för hur bibliotek skall installeras? Find-rutinerna tittar kanske på några ställen men om det inte fungerar behöver cmake hjälp på traven. Det hjälper fortfarande till med att hantera biblioteken dock.

Ja. Windows har ingen standard hur bibliotek ska installeras. Men Linux har detta.

Skrivet av Yoshman:

Backa ett steg och tänk efter: hur ska CMake ha någon som helst chans att lura ut var du råkar placera ett bibliotek som du själv byggt om du inte explicit talar om det?

Antar att du egentligen bara vill ha access till vxWidges. Om så gör detta om du kör Windows:

1. Installera vcpkg

$ git clone https://github.com/microsoft/vcpkg.git $ cd vcpkg $ .\bootstrap-vcpkg.bat

2. Installera vxWidges via vcpkg

.\vcpkg install wxwidgets

3. Integrera ditt CMake bygge med vcpkg
För detta skicka med detta till cmake när du skapar makefilerna

-DCMAKE_TOOLCHAIN_FILE=[path_to_vcpkg]/scripts/buildsystems/vcpkg.cmake

och ha med detta i CMake

find_package(wxWidgets REQUIRED) target_link_libraries(your_target_name PRIVATE wx::wx)

Motsvarande på Linux: om du installerade bibliotek via paket-hanterar kommer CMake 'find_package(wxWidgets REQUIRED)' använda pkg-config som kommer hitta det som behövs.

Ett problem som jag har är att jag har inte tillåtelse att installera Vcpkg på min arbetsdator. Applikationen är inte godkänd.
Så jag har lyckats installera bibliotek igenom att konfigurera MSBuild. MSBuild är riktigt bra.

Permalänk
Datavetare
Skrivet av heretic16:

Ja. Windows har ingen standard hur bibliotek ska installeras. Men Linux har detta.

Ett problem som jag har är att jag har inte tillåtelse att installera Vcpkg på min arbetsdator. Applikationen är inte godkänd.
Så jag har lyckats installera bibliotek igenom att konfigurera MSBuild. MSBuild är riktigt bra.

Om inte er IT-policy specifikt säger "är OK att installera vxWidgets, är inte OK att installera vcpkg" har jag väldigt svårt att se hur du enda inte kan "installera" båda, alt. inte kunna installera någon av dem.

vcpkg "installeras" inte i i normal Windows-mening. Precis som en lokalt bygge av vxWidges lägger du det bara någonstans i din hemkatalog och kör boot-strap scriptet. Krävs inte admin-rights.

Sen lär du väl knappast lyckats bygga det hela med MSBuild (något jag tyvärr behövt lära mig en del om på sistone, man måste ha gravt självskadebeteende för att gilla det ramverket, snacka om något som är expert på att "fail silently"...) med mindre än att explicit pekat ut biblioteket, eller?

Det hade du kunnat uppnå med CMake via dessa rader

... set(FOO_LIB_PATH "/Users/kjn/x/foo") find_library(FOO_LIBRARY foo PATHS "${FOO_LIB_PATH}/build") if(NOT FOO_LIBRARY) message(FATAL_ERROR "foo library not found.") endif() include_directories(app PRIVATE "${FOO_LIB_PATH}") link_directories("${FOO_LIB_PATH}/build") ... stuff that include foo.h and link with libfoo.a/foo.lib

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Skrivet av Yoshman:

Om inte er IT-policy specifikt säger "är OK att installera vxWidgets, är inte OK att installera vcpkg" har jag väldigt svårt att se hur du enda inte kan "installera" båda, alt. inte kunna installera någon av dem.

vcpkg "installeras" inte i i normal Windows-mening. Precis som en lokalt bygge av vxWidges lägger du det bara någonstans i din hemkatalog och kör boot-strap scriptet. Krävs inte admin-rights.

För att applikationerna måste vara godkända. wxWidgets är att kompilera med Visual Studio utan problem. Detta har jag gjort.

Citat:

Sen lär du väl knappast lyckats bygga det hela med MSBuild (något jag tyvärr behövt lära mig en del om på sistone, man måste ha gravt självskadebeteende för att gilla det ramverket, snacka om något som är expert på att "fail silently"...) med mindre än att explicit pekat ut biblioteket, eller?

MSBuild är det finaste som finns. CMake känns omodernt och krångligt. Tusentals konfigurationer. Men MSBuild gör det enkelt och fint. Propert och snyggt.

Citat:

Det hade du kunnat uppnå med CMake via dessa rader

... set(FOO_LIB_PATH "/Users/kjn/x/foo") find_library(FOO_LIBRARY foo PATHS "${FOO_LIB_PATH}/build") if(NOT FOO_LIBRARY) message(FATAL_ERROR "foo library not found.") endif() include_directories(app PRIVATE "${FOO_LIB_PATH}") link_directories("${FOO_LIB_PATH}/build") ... stuff that include foo.h and link with libfoo.a/foo.lib

Jag tror det också att detta hade fungerat. Jag tror jag ska göra en CMakeLists.txt för Linux då jag gillar krossplattform i C++. Och C++ så klart.

Permalänk
Medlem

Hade det inte bara varit att öppna powershell (terminalen i VSC?) och satt variabeln (wxWidgets_LIB_DIR och wxWidgets_ROOT_DIR)?

Permalänk
Skrivet av Petterk:

Hade det inte bara varit att öppna powershell (terminalen i VSC?) och satt variabeln (wxWidgets_LIB_DIR och wxWidgets_ROOT_DIR)?

Detta har jag inte tänkt på faktiskt. Men jag tror att enklaste är att implementera både MSBuild och CMake för projektet.

Permalänk
Datavetare
Skrivet av heretic16:

MSBuild är det finaste som finns. CMake känns omodernt och krångligt. Tusentals konfigurationer. Men MSBuild gör det enkelt och fint. Propert och snyggt.

Är ingen fan av CMake, ju mindre man behöva tänka på byggsystem ju bättre.

Men tror man ändå helt objektivt kan säga att MSBuild inte är något höjdare. Det är nog i första hand byggt för att användas ihop med Visual Studio och för det fungerar det rätt OK.

Kritiken mot MSBuild är att det är väldigt svårt att lära sig (d.v.s. läras sig som i "jag har ett rätt komplext projekt och måste fatta hur det kan hanteras på ett bra sätt inom ramen för MSBuild").

Det har kritik för att skala dåligt till stora projekt, resultate blir ofta längre byggtider än om man använder andra tekniker.

Och det jag avskyr mest med det, MSBuild får en hel del skit för att det är väldigt dålig på att tala om vad som går fel. Ofta sväljs saker tyst om man råkar stava fel på något och så sitter man där och undrar varför det man just aktiverade inte fungerade (ja, bränt en hel del tid på detta).

En sak som, i kontext av byggsystem, ändå får anses vara "modernt" i CMake är att man kan single-step debugga setup-scripten. Det kan förenkla rätt mycket när man försöker reda ut hur man ska lösa något då man kan se vad som finns i context på olika ställen och därmed styra hur man stoppar in sina egna saker.

Sen tror jag många missförstår CMake. Det är inte ett make-system som MSBuild, Gnu Make, Ninja etc. Det är ett meta-byggsystem vars output är ett byggsystem, där man som den av att köra CMake kan välja om output ska vara MSBuild, Gnu Make eller Ninja

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av heretic16:

Detta har jag inte tänkt på faktiskt.

Tror faktiskt det är enklare än så, skapa en .env-fil med variablerna som du lägger i ditt projekt så är det bara att lägga in i din readme att dessa behöver modifieras för att peka rätt.

Så en textfil med namnändelse .env i katalogen där du har din källkod med följande rader:

wxWidgets_ROOT_DIR=C:\C++\wxWidgets-3.2.6
wxWidgets_LIB_DIR=C:\C++\wxWidgets-3.2.6\lib\vc_x64_lib

etc...

Nu använder jag inte Visual Studio Code eller är så intresserad av det, men ser inte hur något du berättat tidigare skulle vara något hinder för att sätta variablerna. T.o.m. vcpkg borde vara ok om den får köras.

Nu finns det olika sätt att göra det på, vet inte om du behöver sätta fler variabler men på detta sätt behövs de ovanstående uppenbart.