MinGW för Visual Studio Community - C++ saknar variabeldefinierade arrayer

Permalänk

MinGW för Visual Studio Community - C++ saknar variabeldefinierade arrayer

Jag måste byta kompilator. Från MSVC till MinGW. Kan jag göra detta i Visual Studio Community?
Kompilatorn MSVC har inte stöd för variabeldefinierade arrayer. Däremot har MinGW det.

Jag använder CMake nu.

Permalänk
Datavetare

Kan inte verifiera att det fungerar då jag inte har MinGW installerat, men borde sättas så här (har testat med LLVM/Clang och där fungerar det)

Värt att nämna är att LLVM/Clang har officiellt stöd i Visual Studio från Microsoft, blog kring hur man kan använda det här. LLVM/Clang stödjer också det du frågar efter och till skillnad från MinGW som är lite av ett "hack" så har LLVM/Clang riktigt bra stöd för Windows.

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:

Kan inte verifiera att det fungerar då jag inte har MinGW installerat, men borde sättas så här (har testat med LLVM/Clang och där fungerar det)

<Uppladdad bildlänk>

Värt att nämna är att LLVM/Clang har officiellt stöd i Visual Studio från Microsoft, blog kring hur man kan använda det här. LLVM/Clang stödjer också det du frågar efter och till skillnad från MinGW som är lite av ett "hack" så har LLVM/Clang riktigt bra stöd för Windows.

Men var får du CMakeSettings.json filen ifrån?
Jag har CMakePresents.json.

Okej...så om LLVM/Clang har det stöd som MinGW har så ska jag testa med LLVM/Clang först. Tack för tipset.

Permalänk
Datavetare
Skrivet av heretic16:

Men var får du CMakeSettings.json filen ifrån?

Filens definition finns här.
Om man skapar ett CMake projekt i VS får man filen "på köpet".

Kan inte ge speciellt mycket hjälp kring just CMake i VS. Har använt CMake en del samt, fast då när man kör CLI på Linux/MacOS, inte ihop med 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 Yoshman:

Filens definition finns här.
Om man skapar ett CMake projekt i VS får man filen "på köpet".

Kan inte ge speciellt mycket hjälp kring just CMake i VS. Har använt CMake en del samt, fast då när man kör CLI på Linux/MacOS, inte ihop med VS.

Såg att Visual Studio hade inbyggt installationsstöd för Clang. Helt underbart. Man behöver knappt konfigurera något med Visual Studio. Dock så är det MSBuild jag talar om nu.

Permalänk

Om man får nu detta efter man har ändrat från Platform Toolset Visual Studio 2022 till LLVM (clang-cl)

1>lld-link.exe : error : could not open C:\Sources\Extern\vcpkg\installed\x64-windows\debug\lib\*.lib: invalid argument

Vad ska man göra då?

Permalänk
Hedersmedlem
Skrivet av heretic16:

Om man får nu detta efter man har ändrat från Platform Toolset Visual Studio 2022 till LLVM (clang-cl)

1>lld-link.exe : error : could not open C:\Sources\Extern\vcpkg\installed\x64-windows\debug\lib\*.lib: invalid argument

Vad ska man göra då?

Är det något speciellt bibliotek du försöker länka till? ”*.lib” ser också lite misstänkt ut.

Permalänk
Skrivet av Elgot:

Är det något speciellt bibliotek du försöker länka till? ”*.lib” ser också lite misstänkt ut.

Bakgrunden till problemet är att jag har använt mig av MSVC kompilatorn. Den är OK...men den saknar VLA - Variable Length Array. Clang och MinGW har tydligen löst detta problem med ett litet "hack". Jag är van med MinGW, dvs GCC då jag tycker dessa kompilatorer är riktigt bra. Dessutom krossplattform.

Jag testade Clang med Visual Studio 2022 (Community) och då hade jag problem med vcpkg.
Jag testade då installera Eclipse CDT, som jag finner är en av dom bästa IDE verktygen för C och C++ då man behöver inte konfigurera så mycket.

I vcpkg finns det två mappar. En heter "include" och andra heter "lib".
Låt oss säga så här, jag vill ändra lite i min frågeställning i tråden, men utgångspunkten kommer vara det samma.
Jag vill få "include" att länka. Det har jag tydligen fått. Men ändå får jag ett problem så som

undefined reference to `ImGui::Begin(char const*, bool*, int)' undefined reference to `mysqlx::abi2::r0::common::Settings_impl::Data::init_connection_attr()'

Trots att "imgui.h" och "<mysqlx/xdevapi.h>" är tillgänglig i min IDE.

Så vad mer ska jag länka?

Permalänk
Hedersmedlem
Skrivet av heretic16:

Så vad mer ska jag länka?

Du är nog på rätt spår, men istället för *.lib får du kanske peka ut alla (relevanta) bibliotek var för sig.
CMake har ju också funktioner för att hitta och peka ut bibliotek åt dig, men detta bör ju också fungera.

Permalänk
Skrivet av Elgot:

Du är nog på rätt spår, men istället för *.lib får du kanske peka ut alla (relevanta) bibliotek var för sig.
CMake har ju också funktioner för att hitta och peka ut bibliotek åt dig, men detta bör ju också fungera.

Jag har lite svårt att använda CMake då jag vet knappt vad man ska skriva i CMakeFileLists.txt.

I Eclipse så kan man länka hela mappen.
Typ så här.

Men det blir inget annat resultat när jag kompilerar.
Det enda jag får är den där lilla extra "g++ "-LC:\\Users\\dmn\\GitHub\\vcpkg\\installed\\x64-windows\\lib""

g++ "-LC:\\Users\\dmn\\GitHub\\vcpkg\\installed\\x64-windows\\lib" -o ....

Det som händer är att den verkar kompilera allt till .o filer och sedan så när den ska köra programmet så bråkar den på att vissa funktioner till klasser inte finns eller är odefinierade.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Jag har lite svårt att använda CMake då jag vet knappt vad man ska skriva i CMakeFileLists.txt.

I Eclipse så kan man länka hela mappen.
Typ så här.

https://www.bildtagg.se/file/rdlx74yp81v3i9993x0dy3

Men det blir inget annat resultat när jag kompilerar.
Det enda jag får är den där lilla extra "g++ "-LC:\\Users\\dmn\\GitHub\\vcpkg\\installed\\x64-windows\\lib""

g++ "-LC:\\Users\\dmn\\GitHub\\vcpkg\\installed\\x64-windows\\lib" -o ....

Det som händer är att den verkar kompilera allt till .o filer och sedan så när den ska köra programmet så bråkar den på att vissa funktioner till klasser inte finns eller är odefinierade.

Typiskt behöver du något snarlikt i CMakeLists.txt

target_link_libraries(<projektnamn> <sökväg till lib-fil>)

men om du får det att fungera i eclipse (du måste nog bara lägga till alla lib-filer i den övre rutan) kan man kopiera raderna därifrån

Permalänk
Skrivet av Elgot:

Typiskt behöver du något snarlikt i CMakeLists.txt

target_link_libraries(<projektnamn> <sökväg till lib-fil>)

men om du får det att fungera i eclipse (du måste nog bara lägga till alla lib-filer i den övre rutan) kan man kopiera raderna därifrån

Så jag måste lägga till bibliotek i den övre rutan? Trodde jag hade redan gjort detta igenom att länka mappen.
Antar att det är typ -lmysq och -limgui som jag ska skriva med -l först. Men hur vet jag vad jag ska skriva?

Permalänk
Hedersmedlem
Skrivet av heretic16:

Så jag måste lägga till bibliotek i den övre rutan? Trodde jag hade redan gjort detta igenom att länka mappen.
Antar att det är typ -lmysq och -limgui som jag ska skriva med -l först. Men hur vet jag vad jag ska skriva?

Ja, systemet är att peka ut katalogerna som man skall söka i med ”-L” och sedan namnen på biblioteken med ”-l”. Vad händer om du försöker lägga till en lib-fil med den gröna plus-knappen?

Permalänk
Skrivet av Elgot:

Ja, systemet är att peka ut katalogerna som man skall söka i med ”-L” och sedan namnen på biblioteken med ”-l”. Vad händer om du försöker lägga till en lib-fil med den gröna plus-knappen?

Jag antar att om jag ska länka "imgui.lib" så skall jag skriva "-limgui" ?

Edit.
Nu efter jag har installerat klart med vcpkg (gjorde en ominstallation) så säger den

The package boost is compatible with built-in CMake targets: find_package(Boost REQUIRED [COMPONENTS <libs>...]) target_link_libraries(main PRIVATE Boost::boost Boost::<lib1> Boost::<lib2> ...) imgui provides CMake targets: # this is heuristically generated, and may not be correct find_package(imgui CONFIG REQUIRED) target_link_libraries(main PRIVATE imgui::imgui) mysql-connector-cpp provides CMake targets: # this is heuristically generated, and may not be correct find_package(unofficial-mysql-connector-cpp CONFIG REQUIRED) target_link_libraries(main PRIVATE unofficial::mysql-connector-cpp::connector) C:\vcpkg>

Permalänk
Hedersmedlem
Skrivet av heretic16:

Jag antar att om jag ska länka "imgui.lib" så skall jag skriva "-limgui" ?

https://www.bildtagg.se/file/zvjk10j2jrup0jc6yysobzf

Den verkar ju inte lägga till ”-L” i undre rutan så den kanske sköter sådant själv. Frågan är om man skall skriva ”.lib” eller inte.

Permalänk
Skrivet av Elgot:

Den verkar ju inte lägga till ”-L” i undre rutan så den kanske sköter sådant själv. Frågan är om man skall skriva ”.lib” eller inte.

Jag testade lägga till -limgui och -lmysqlcppconn8

....."src\\Windows\\Windows.o" -limgui -lmysqlcppconn8

Men samma problem uppstår.
Det verkar som jag gör rätt också
https://downloads.mysql.com/docs/connector-cpp-8.0-en.pdf

Permalänk
Hedersmedlem
Skrivet av heretic16:

g++ "-LC:\\Users\\dmn\\GitHub\\vcpkg\\installed\\x64-windows\\lib" -o ....

De där citationstecknen kring L-argumentet verkar misstänkta också.

Permalänk
Skrivet av Elgot:

De där citationstecknen kring L-argumentet verkar misstänkta också.

Det är Eclipse som skapar detta.
Jag tror jag vet varför det krånglar för mig.
När jag laddar ned paket så använder jag vcpkg bara för att det är enkelt. Testade Conan, men den fungerade inte riktigt. Men när jag ska använda dessa installerade .h och .lib filer så använder jag minGW. Vcpkg verkar använda en annan kompilator.

Permalänk

Vad använder du för C++ IDE?

Permalänk
Medlem

Tror inte du ska manuellt peka in i vcpkgs mappar. Tror vcpkg använder kompilator beroende på vilka "triplets" man anger vid installation av ett lib. På Windows är default msvc 32bit. Om mingw kör samma abi som gcc/clang har jag ingen koll på men de känns som att de kan bli fel där.

Permalänk
Skrivet av Frappee:

Tror inte du ska manuellt peka in i vcpkgs mappar. Tror vcpkg använder kompilator beroende på vilka "triplets" man anger vid installation av ett lib. På Windows är default msvc 32bit. Om mingw kör samma abi som gcc/clang har jag ingen koll på men de känns som att de kan bli fel där.

Det tror jag också.
Eclipse IDE är en bra IDE, men just nu börjar jag bli besviken på den. Men troligtvis så är det inte Eclipses fel.

Hur gör jag här liksom om jag vill få något att fungera?
Måste jag kompilera från källkod?

Här hittade jag något.
Jag kan ändra vcpkg till mingw
https://github.com/microsoft/vcpkg/blob/master/docs/users/min...

Citat:

For convenience, you can use environment variables to set both triplets:

export VCPKG_DEFAULT_TRIPLET=x64-mingw-dynamic
export VCPKG_DEFAULT_HOST_TRIPLET=x64-mingw-dynamic

Vilka miljövariabler?

Permalänk
Medlem
Skrivet av heretic16:

Det tror jag också.
Eclipse IDE är en bra IDE, men just nu börjar jag bli besviken på den. Men troligtvis så är det inte Eclipses fel.

Hur gör jag här liksom om jag vill få något att fungera?
Måste jag kompilera från källkod?

Här hittade jag något.
Jag kan ändra vcpkg till mingw
https://github.com/microsoft/vcpkg/blob/master/docs/users/min...

Vilka miljövariabler?

Du behöver inte ändra miljövariablerna, det sätter du i Windows inställningar globalt på din dator (sök enviroment variables i sök) men du kan bara ange dom när du installerar imgui,
"vcpkg install imgui:x64-mingw-static" (eller dynamic istället för static)

Permalänk
Skrivet av Frappee:

Du behöver inte ändra miljövariablerna, det sätter du i Windows inställningar globalt på din dator (sök enviroment variables i sök) men du kan bara ange dom när du installerar imgui,
"vcpkg install imgui:x64-mingw-static" (eller dynamic istället för static)

Vad är det för skillnad om jag använder static eller dynamic?

Permalänk
Hedersmedlem
Skrivet av heretic16:

Vilka miljövariabler?

Om du kör vcpkg i cmd kan du kanske köra:

set VCPKG_DEFAULT_TRIPLET=x64-mingw-dynamic set VCPKG_DEFAULT_HOST_TRIPLET=x64-mingw-dynamic

innan du anropar vcpkg.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Vad är det för skillnad om jag använder static eller dynamic?

Vid statisk länkning bygger man in all kod i programmet medan dynamisk länkning kommer kräva att rätt dll-filer hittas vid körning.

Skrivet av heretic16:

Vad använder du för C++ IDE?

Jag brukar köra Qt Creator eller Visual Studio beroende på situation. Eller VS Code eller emacs (fast de klassas ju inte som IDE).

Permalänk
Skrivet av Elgot:

Om du kör vcpkg i cmd kan du kanske köra:

set VCPKG_DEFAULT_TRIPLET=x64-mingw-dynamic set VCPKG_DEFAULT_HOST_TRIPLET=x64-mingw-dynamic

innan du anropar vcpkg.

I kommndotolken?
Så nu har jag gjort det. Ska jag då anropa

vcpkg install imgui[core]:x64-windows då?

Permalänk
Medlem
Skrivet av heretic16:

Vad är det för skillnad om jag använder static eller dynamic?

Dynamic gör att du får dll filer som behöver shippas med exe och ger dig möjlighet att byta ut dom utan att kompilera om hela programmet.

Permalänk
Hedersmedlem
Skrivet av heretic16:

I kommndotolken?
Så nu har jag gjort det. Ska jag då anropa

vcpkg install imgui[core]:x64-windows då?

Jag skulle gissa det, men jag har inte testat själv.

Permalänk
Skrivet av Elgot:

Vid statisk länkning bygger man in all kod i programmet medan dynamisk länkning kommer kräva att rätt dll-filer hittas vid körning.

Jag brukar köra Qt Creator eller Visual Studio beroende på situation. Eller VS Code eller emacs (fast de klassas ju inte som IDE).

Qt Creator gillar jag faktiskt. Dock så passar inte ImGui med QtCreator.

Permalänk
Skrivet av Elgot:

Jag skulle gissa det, men jag har inte testat själv.

Det verkar fungera

C:\vcpkg>vcpkg install imgui:x64-windows Computing installation plan... The following packages will be built and installed: imgui[core]:x64-windows -> 1.88#1 * vcpkg-cmake[core]:x64-mingw-dynamic -> 2022-10-30 * vcpkg-cmake-config[core]:x64-mingw-dynamic -> 2022-02-06#1 Additional packages (*) will be modified to complete this operation. Detecting compiler hash for triplet x64-mingw-dynamic... Detecting compiler hash for triplet x64-windows... Restored 0 package(s) from C:\Users\dmn\AppData\Local\vcpkg\archives in 2.991 ms. Use --debug to see more details. Installing 1/3 vcpkg-cmake:x64-mingw-dynamic... Building vcpkg-cmake[core]:x64-mingw-dynamic... warning: -- Using community triplet x64-mingw-dynamic. This triplet configuration is not guaranteed to succeed. -- [COMMUNITY] Loading triplet configuration from: C:\vcpkg\triplets\community\x64-mingw-dynamic.cmake -- Installing: C:/vcpkg/packages/vcpkg-cmake_x64-mingw-dynamic/share/vcpkg-cmake/vcpkg_cmake_configure.cmake -- Installing: C:/vcpkg/packages/vcpkg-cmake_x64-mingw-dynamic/share/vcpkg-cmake/vcpkg_cmake_build.cmake -- Installing: C:/vcpkg/packages/vcpkg-cmake_x64-mingw-dynamic/share/vcpkg-cmake/vcpkg_cmake_install.cmake -- Installing: C:/vcpkg/packages/vcpkg-cmake_x64-mingw-dynamic/share/vcpkg-cmake/vcpkg-port-config.cmake -- Installing: C:/vcpkg/packages/vcpkg-cmake_x64-mingw-dynamic/share/vcpkg-cmake/copyright -- Performing post-build validation -- Performing post-build validation done Stored binary cache: "C:\Users\dmn\AppData\Local\vcpkg\archives\af\af49594a39d28b031df5b6da6f9db3001631e791f7206894538d6a351aeeedb6.zip" Elapsed time to handle vcpkg-cmake:x64-mingw-dynamic: 171.5 ms Installing 2/3 vcpkg-cmake-config:x64-mingw-dynamic... Building vcpkg-cmake-config[core]:x64-mingw-dynamic... warning: -- Using community triplet x64-mingw-dynamic. This triplet configuration is not guaranteed to succeed. -- [COMMUNITY] Loading triplet configuration from: C:\vcpkg\triplets\community\x64-mingw-dynamic.cmake -- Installing: C:/vcpkg/packages/vcpkg-cmake-config_x64-mingw-dynamic/share/vcpkg-cmake-config/vcpkg_cmake_config_fixup.cmake -- Installing: C:/vcpkg/packages/vcpkg-cmake-config_x64-mingw-dynamic/share/vcpkg-cmake-config/vcpkg-port-config.cmake -- Installing: C:/vcpkg/packages/vcpkg-cmake-config_x64-mingw-dynamic/share/vcpkg-cmake-config/copyright -- Performing post-build validation -- Performing post-build validation done Stored binary cache: "C:\Users\dmn\AppData\Local\vcpkg\archives\dd\dd2d974713a517a655beecec053448aa8edaab61a9077a7294e9af7e83a49e54.zip" Elapsed time to handle vcpkg-cmake-config:x64-mingw-dynamic: 206.3 ms Installing 3/3 imgui:x64-windows... Building imgui[core]:x64-windows... -- Note: imgui only supports static library linkage. Building static library. -- Using cached ocornut-imgui-v1.88.tar.gz. -- Cleaning sources at C:/vcpkg/buildtrees/imgui/src/v1.88-34c93572a3.clean. Use --editable to skip cleaning for the packages you specify. -- Extracting source C:/vcpkg/downloads/ocornut-imgui-v1.88.tar.gz -- Using source at C:/vcpkg/buildtrees/imgui/src/v1.88-34c93572a3.clean -- Configuring x64-windows -- Building x64-windows-dbg -- Building x64-windows-rel -- Installing: C:/vcpkg/packages/imgui_x64-windows/share/imgui/copyright -- Performing post-build validation -- Performing post-build validation done Stored binary cache: "C:\Users\dmn\AppData\Local\vcpkg\archives\0b\0be928909bba9b1148bdfed1673157dc24b7ba0bff90f8410487ed66c104578b.zip" Elapsed time to handle imgui:x64-windows: 8.835 s Total install time: 17.32 s imgui provides CMake targets: # this is heuristically generated, and may not be correct find_package(imgui CONFIG REQUIRED) target_link_libraries(main PRIVATE imgui::imgui) C:\vcpkg>