Programiranje u C++-u - pitanja i odgovori izdvojena tema

poruka: 7.285
|
čitano: 1.616.455
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Djuro von Prekoplotovich kaže...
CalvinRi kaže...
Nisam izbildao, niti pokrenuo ali odoka gledano, imas dosta bugova :)

 

int niz[5] //5 fiksnih elemenata

 

Ne vidim da dalje u kodu igdje imas provjeru da li si prekardasio sa indexom:

1. u do/while petlji 

niz[i] = neparni_broj;//tu ce vrisnut nakon 5 unesenih

2. for petlja kasnije ima takodjer neki cudan uvjet:

for(int i =0; i<niz[i]; i++)

 

plus si mogao stavit break kad nadjes najveci...

 

al vidim da se OP ne buni, valjda je njemu ok :)

 

 

Probaj unijeti broj manji od 0.

Ne treba niti niz. Dovoljan je jedan integer za spremanje najveće vrijednosti i jedan za spremanje trenutnog unosa.

 

Iako autor to tvrdio, rješenje nije valjani "C" kod.

Kompajlira se bez prijavljivanja tog upozorenja (GCC 10.3, -Wall, -Wextra, -fpedantic) , izvršava se bez rušenja, ali pedantni će lako vidjeti gdje je problem.

 

Prijavljena upozorenja:

Po mom skromnom mišljenju, a pošto je ovo C++ tema, najbolje rješenje uključivalo bi barem jedan template (npr. "veći-od"), lambdu i Boost za parsanje inputa.

U prethodnom prijedlogu nisam se dovoljno potrudio.

Ja volim koristit std c++ strukture, npr std::set bi to automatski posortirao unesene po velicini, a ja bi kod inserta samo gledao jel neparni. A bas jos i boost ukljucit za ovo je mozda mali overkill :) ...iako u stvarnom zivotu bi ga koristio.

The best thing about having a penis is sharing it with people who don&#39;t
12 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
CalvinRi kaže...

Ja volim koristit std c++ strukture, npr std::set bi to automatski posortirao unesene po velicini, a ja bi kod inserta samo gledao jel neparni. A bas jos i boost ukljucit za ovo je mozda mali overkill :) ...iako u stvarnom zivotu bi ga koristio.

 

Za srednjoškolske radove ponavljača gradiva moraš obavezno imati boost i stvari iz zadnje verzije standarda. Na faksu za slične zadatke zadnji Qt.

Joj!
9 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
ACPWinters kaže...

Pozdrav ekipa, skinuo sam C++ Builder i ne radi mi intellisense iliti code insight. Jel ima neki fix za to? Ne radi na najobicnijem primjeru tipa gumb u groupboxu sa Edit1. Kad napisem Edit1-> ne izbacuje nista ni kad stisnem ctrl + space. Na google nisam nasao nista od pomoci, jel ima netko nekakvu ideju?

 Cisto ako nekom treba, rjesio sam problem, otisao sam pod Project -> Options -> C++ Compiler i stavio "Use Classic compiler" na True.

14 godina
offline
Programiranje u C++-u - pitanja i odgovori

Imam ovako zapravo općenito pitanje. Evo naučio sam principe objektno orijentiranog programiranja, imam to neko temeljno znanje iz programiranje općenito, što je sljedeći korak. Ovi neki zadaci pronađi ovaj onaj, ovakav sort onakav sort itd. su mi prelagani, a kad pokušavam naći neke kodove nečeg kompleksnijeg tu pak ništa ne razumijem, bih li sam trebao smisliti neki projekt na temelju svog znanja pa ga onda proširivati, ne znam, nemam nekih ideja.

 
0 0 hvala 0
10 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

@Hazar

 

Samo kroz praksu uči. Kao i matematiku. 

Proučavaj tuđe kodove.

Panzerkampfwagen.dzg-C++-USA. :-) CZ-75
14 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Smisli neki projekt koji želiš raditi i izradi ga, tako ćeš najbolje učiti - kad sam udariš u problem. Dobri startni projekti su ti nešto npr. todo lista, vremenska prognoza i sl. Ako imaš neki hobi probaj isprogramirati nešto vezano uz to, motivacija će biti jača. Imaš i po netu ideja za startne projekte, npr. https://codeburst.io/starter-project-ideas-for-developers-760b5def1793 Usput pročavaj malo oblikovne obrasce, najbolje prakse, načela u razvoju i slično. Gledaj tuđe projekte na githubu.

The most interesting information comes from children, for they tell all they know and then stop.
15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Hazar kaže...

Imam ovako zapravo općenito pitanje. Evo naučio sam principe objektno orijentiranog programiranja, imam to neko temeljno znanje iz programiranje općenito, što je sljedeći korak. Ovi neki zadaci pronađi ovaj onaj, ovakav sort onakav sort itd. su mi prelagani, a kad pokušavam naći neke kodove nečeg kompleksnijeg tu pak ništa ne razumijem, bih li sam trebao smisliti neki projekt na temelju svog znanja pa ga onda proširivati, ne znam, nemam nekih ideja.

 Kad ljude uče principe objektno orijentiranog programiranja, vrlo često im se zaboravi reći da postoje tkz. oblikovni obrasci. To su jednostavno "načini" kako se koristi OOP za rješavanje nekih problema, pa kroz njihovo učenje, i implementiranje u kodu, barem stekneš neki osjećaj kako koristiti OOP.

 

Ovo je klasična knjiga:
https://en.wikipedia.org/wiki/Design_Patterns

 

Naravno, postoje jasne kritike na njih (možeš ih overuseati, neke stvari se rješavati drugačije, itd.), ali zasada se ne zamaraj tim, već kreni čisto od njih, konkrentnije od klasničnog primjera uređivača teksta (koji se analizira već u prvom poglavlju te knjige). 

 

Pogledaj zadatak 2. ovdje http://www.zemris.fer.hr/~ssegvic/ooup/ooup3lab.shtml (zadatak 1. zanemari ako te ne zanima C dio), i ovo http://www.zemris.fer.hr/~ssegvic/ooup/ooup4lab.shtml

 

Ovo je tema o C++-u, pa pretpostavljam da to radiš u C++-u, onda se ne bi bilo loše upoznati kako se oop u praksi implementira (da razumijes sto su virtualni pozivi i sl), pa onda pogledaj i ostale lab vjezbe i gradivo: http://www.zemris.fer.hr/~ssegvic/ooup/

12 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Početnicima u Pythonu obično dam da naprave Blackjack.

 

Zgodno je što započne relativno jednostavno (napravi jedan špil karata i promiješaj ga), a onda se progresivno dodaje sve više i više elemenata (praćenje uloga, više špilova karata, double-down, split).

14 godina
offline
Programiranje u C++-u - pitanja i odgovori

Hvala ljudi! Puno ste pomogli.

 
1 0 hvala 0
2 godine
protjeran
offline
Programiranje u C++-u - pitanja i odgovori

Pozdrav,

Imam dvije klase, A i B. A je parent klasa B klasi.

Dakle, to ovako izgleda

 

class A : public B

{

protected:

int x;

};

 

class B

{

public:

foo();

};

 

U klasi B postoji public funkcija koja treba pristupiti varijabli iz klase A. Varijabla u klasi A je protected.

VS Code mi daje error:

 

"member "ProgLED::rIdx" (declared at line ...) is inaccessible"

 

Kod izgleda ovako

 

  color[ProgLED::rIdx] = r;

  color[ProgLED::gIdx] = g;

  color[ProgLED::bIdx] = b;

Koju god kombinaciju napravim, ne valja.
rIdx, gIdx i bIdx se nalaze kod parenta(class A) i jednaki su za sve childove(class B).
color polje se nalazi u childa(class B)
 
0 0 hvala 0
15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Koliko vidim iz koda, nije klasa A nadklasa klase B, već obrnuto. Dole si deklarirao klasu B, a gore deklariraš klasu A koja nasljeđuje B. U A si dodao član x, a B nema toga člana.

U primjeru bi ti trebalo biti obrnuto:

 

class A {
    protected:
    int x;
};

class B : public A {
    void foo() {
        A::x = 5;
    }
};

2 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori
A situacija je ovakva - jedan objekt od klase A može imati N objekata klase B(pomoću templatea).
Klasa A predstavlja liniju koja ima N LEDica koje predstavlja klasa B.
Ako napravim da je class B : public A zar to ne bi bilo da klasa B sadrži sve varijable od klase A?
Čudno mi to nekako funckniora.
15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
silvio3105 kaže...
A situacija je ovakva - jedan objekt od klase A može imati N objekata klase B(pomoću templatea).
Klasa A predstavlja liniju koja ima N LEDica koje predstavlja klasa B.
Ako napravim da je class B : public A zar to ne bi bilo da klasa B sadrži sve varijable od klase A?
Čudno mi to nekako funckniora.

Dakle, kad kažeš da A može imati N objekata klase B preko templatea, jel misliš da je cijela klasa parametrizirana, tj. da imaštemplate ispred deklaracije klase:

 

template <int N>
class A {

// ... implementacija

};

 

U tom slučaju, ne možeš imati da B nasljeđuje A jer A je parametriziran (dakle konkretna instanca ovisi o vrijednosti N), tipa mogao bi imati
class B : public A<5>, ili bi ti i B trebala biti parametrizirana

 

template <int N>

class B : public A<N> {

///

}


Kod templatea, svaka instanca templatea je zasebna klasa, A<5> bi bilo razlicito od A<4>, isto kao sto je std::vector<std::string> razlicit tip od std::vector<int>.

E sad, meni nije jasno što želiš postići. Dakle želiš da A sadrži N objekata od B, i da B nasljeđuje A. To nije moguće jer onda bi imao B koji je A pa ima N B objekata, koji je svaki A pa svaki ima još po N objekata, i tako beskonačno.

To je u osnovi isti razlog zašto klasa ne može sadržavati član čiji je tip upravo ta klasa jer nema logički smisla. No ono što klasa može sadržavati je referencu/pokazivač na tu klasu. Tipa možeš imati:


class A {
A* drugiClan;
};

Npr. to vidiš kad implementiraš povezanu listu (onda Nodeovi imaju pokazivače na sljedeći Node, itd.). Kod tebe bi mogo imati tipa (samo bi prije toga morao imati deklaraciju: samo class B; ):


class A {

protected:
std::vector<B> drugi;

//..
}

class B : public A {
// implementacija
};


Sad bi trebali vidjeti zašto ti želiš imati gornju stvar, tj. da ti objekti "sadrže sami sebe" (samo ćeš to "sadržavanje" morati implementirati preko pokazivača). Ne znam jel pokušavaš iskoristiti oblikovni obrazac kompozit. U tom slučaju, tipa želio bi imati jednu klasu koja bi mogla predstavljati i jednu ledicu, i red ledica i sl, a da onaj tko primi takav objekt ne mora znati detalje toga.

2 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori
Ovako mi sad izgleda header file

https://github.com/silvio3105/ProgLED/blob/v0.1/ProgLED.h

Pristup tim varijablama sam riješio preko getter funkcija.

Ideja je da s tim libom na kraju napraviš nešto ovako

ProgLED 5 linija // LED linija koja ima pet LEDica u sebi

linija.on() // pali sve ledice u liniji
linija.led[3].off() // gasi četvrtu ledicu u liniji, ostale nisu taknute.

Jedino još što me muči je da li će

ProgLED 5 i ProgLED 10 stvorit dvije kopije funkcija u flash memoriji. Jedina razlika između objekata je u veličini polja. Funkcije su za sve iste.

Ne mogu napisati više manje zagrade
15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
silvio3105 kaže...
Ovako mi sad izgleda header file

https://github.com/silvio3105/ProgLED/blob/v0.1/ProgLED.h

Pristup tim varijablama sam riješio preko getter funkcija.

Ideja je da s tim libom na kraju napraviš nešto ovako

ProgLED 5 linija // LED linija koja ima pet LEDica u sebi

linija.on() // pali sve ledice u liniji
linija.led[3].off() // gasi četvrtu ledicu u liniji, ostale nisu taknute.

Dakle, LED predstavlja jedan LED čip? Koliko vidim i ta klasa je parametrizirana preko templatea i to preko tipa. Ne vidim nigdje u kodu da taj tip koristiš.

I onda kad ProgLED nasljeđuje, onda treba nasljeđivati konkrentnu instancu toga templatea, dakle ne može biti class ProgLED : public LED, već mora biti ProgLED : public LED<nekiTip>.  Možda najbolje da to izbaciš jer ti ne treba (jedino ako misliš nešto kasnije s tim raditi), dakle da LED samo ostane klasa, a ne template.

E onda može ProgLED nasljeđivati LED. Sad je samo pitanje zašto želiš da ti ProgLED nasljeđuje LED.  Koliko sam skužio, iz ovog odsječka ti želiš polimorfizam, tipa da imaš LED led, i onda taj led može biti jedan led čip, ili linija ledica, i kad pozovše on, da se upali ili ta jedna ledica, ili da se upali jedan red. U tom slučaju, on će ti imati različitu implementaciju u ProgLED istanci u odnosu na LED instancu, i onda ta funkcija mora biti virtualna.

Dakle u LED moraš staviti virtual void on(), isto i u ProgLED (ili void on() override;). Slično i za ostale metode.

silvio3105 kaže...
Jedino još što me muči je da li će

ProgLED 5 i ProgLED 10 stvorit dvije kopije funkcija u flash memoriji. Jedina razlika između objekata je u veličini polja. Funkcije su za sve iste.

Ne mogu napisati više manje zagrade

 Mislim da hoće, možda može kompajler nešto optimizirati pri tome, možda se možeš igrati s nekim parametrima pri kompilaciji. Sad je pitanje hoće li ti to biti problem.

Ako bude problem, onda stavi da ProgLED ne bude parametriziran po broju ledica, već da u sebi ima dinamičko polje LED instanci (tipa preko std::vector, ili preko običnog polja, ali moraš paziti da ga u destroktoru oslobodiš), a da broj ledica prima preko konstruktora.

Poruka je uređivana zadnji put sri 2.11.2022 17:19 (captain_soap_McTawish).
2 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori
Nema naprednih fičera C++a jer je embedded u pitanju.
ProgLED je linija LEDica. Možeš na nju gledati kao na LED traku koja ima N LEDica.
Klasa Led predstavlja jedan pixel, jednu LEDicu na toj Led traci (klasa ProgLED).

Koristim template za Led klasu jer se u definiciji rgb funkcije(ProgLED.cpp) od klase Led spominje getRIdx od ProgLED klase koja koristi template.
Taj rIdx(varijabla koju geta getRIdx) je ista za cijeli ProgLED objekt i sve objekte Led klase unutar ProgLED objekta.
Samo taj dio s pristupom parent klasi me jebe.
Bit je da cijeli lib uzima što manje RAMa, ROMa i da nema previše overheada

Za sada nemam errora ali mi još komponente nisu stigle pa ne mogu hardware napraviti.
Poruka je uređivana zadnji put sri 2.11.2022 17:54 (silvio3105).
15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
silvio3105 kaže...
Nema naprednih fičera C++a jer je embedded u pitanju.
ProgLED je linija LEDica. Možeš na nju gledati kao na LED traku koja ima N LEDica.
Klasa Led predstavlja jedan pixel, jednu LEDicu na toj Led traci (klasa ProgLED).

Koristim template za Led klasu jer se u definiciji rgb funkcije(ProgLED.cpp) od klase Led spominje getRIdx od ProgLED klase koja koristi template.
Taj rIdx(varijabla koju geta getRIdx) je ista za cijeli ProgLED objekt i sve objekte Led klase unutar ProgLED objekta.
Samo taj dio s pristupom parent klasi me jebe.
Bit je da cijeli lib uzima što manje RAMa, ROMa i da nema previše overheada

Za sada nemam errora ali mi još komponente nisu stigle pa ne mogu hardware napraviti.

 Mislim da si pomiješao parent i child klasu. Dakle tebi je parent klara LED, a ProgLED nju nasljeđuje. ProgLED ima pristup svemu od LED, ali ne vrijedi obrnuto. Ti sad iz nadklase želiš pristupiti članu svoje podklase, dakle svoga djeteta.

Nije mi uopće jasno kako se ovo što si napisao može kompajlati: color[this->getRIdx()] = r; Dakle ovo je kontekstu metode iz objekta LED, a this je onad pointer na konkrentu instancu LED-a, a LED u sebi nema metodu getRIdx(). Ne znam jesi probao to komapjlati, ili ti samo vs code ne baca errore, ali moguće da ti ne baca errore jer si prije toga stavio ovu template deklaraciju, pa onda ne zna što će s tim.

2 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori
Kako uradit onda?
Stavit
Class ProgLED

Clasd Led : public Led

?
15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
silvio3105 kaže...
Kako uradit onda?
Stavit
Class ProgLED

Clasd Led : public Led

?

 Trebalo bi malo promijeniti dizajn, zato je bitno što želiš s tim nasljeđivanjem i klasama konkretno postići. Ako je su indexi stalni, i jednaki za svaki led, onda ih ima smisla staviti u klasu LED, i to kao statičke članova (da nema svaki led objekt kopiju njih, već da je na razini klase, tako štediš i nešto prostora).

2 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori
Ti indexi su promijenljivi, ovisno o formatu kojeg LEDica prima. Najčešće prima GRB, a ne RGB.
Jedna traka(ProgLED) može imati GRB format, a druga RGB format.

Želim postići da sve metode iz LED klase mogu uhvatiti podatke iz ProgLED klase ali da jedan ProgLED objekt može imati N LED objekata.
Poruka je uređivana zadnji put sri 2.11.2022 19:03 (silvio3105).
2 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori

Novi kod: https://github.com/silvio3105/ProgLED/tree/dev

 

Stavio sam class LED: public ProgLED<T> no sad opet moram stavit template(u .cpp) za sve metode iz LED klase.

 

15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
silvio3105 kaže...

Novi kod: https://github.com/silvio3105/ProgLED/tree/dev

 

Stavio sam class LED: public ProgLED<T> no sad opet moram stavit template(u .cpp) za sve metode iz LED klase.

 

 Dakle iz LED-a makni template jer ti to ne služi ničemu. Onda ovo class LED da nasljeđuje ProgLED<nešto> koji nasljeđuje opet LED neće funkcionirati jer će klasa nasljeđivati samu sebe što nema logički smisla.

I nije samo stvar u davanju pristupa članovima ProgLED, to napraviš preko friend deklaracije. Dakle unutar deklaracije ProgLED-a stavi friend class LED; To znači da će metode iz LED moći pristupati svemu iz ProgLED.

 

No sad je pitanje kojem ProgLED. Tipa, ProgLED sadrži LED-ove, no LED-ovi ne znaju koji ih ProgLED sadrži jer nemaju tu informaciju. Moraš onda u te LED instance pohraniti referencu ili pokazivač na progLED. Npr. dodaj u LED klasu privatni član: ProgLED* progLED. I onda kad ProgLED konstruira LED, neka postavi to, ili preko konstruktora, ili preko setttera. 

Kad ti bude trebao RIdx, pisat ćeš progLED->getRIdx() ili progLED->rIdx.

Poruka je uređivana zadnji put sri 2.11.2022 20:02 (captain_soap_McTawish).
2 godine
protjeran
offline
Re: Programiranje u C++-u - pitanja i odgovori
Sredio na drugi način.

https://github.com/silvio3105/ProgLED
 
1 0 hvala 0
14 godina
offline
Programiranje u C++-u - pitanja i odgovori

Pokušavam se spojit na MySQL bazu, ali nikako. Htio bih napravit jednu desktop aplikaciju, ali treba mi baza. Na windowsima sam, mislim da sam dobro postavio sve .h fajle i librarye, tu sam isto morao svašta izvesti.

 

main.cpp, običan program za spajanje na bazu

 

#include <stdlib.h>
#include <iostream>
#include <mysql_connection.h>
#include <driver.h>
#include <exception.h>
#include <resultset.h>
#include <statement.h>

using namespace sql;
int main(void){
sql::Driver *driver;
sql::Connection *con;

driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306","root","pass");

return 0;
}

 

Evo i CMakeLists, ali rekao bih da nije tu problem

 

cmake_minimum_required(VERSION 3.27)
project(fajnensapp)

set(CMAKE_CXX_STANDARD 23)


set(CMAKE_PREFIX_PATH "C:/Qt/6.7.2/mingw_64")

find_package(Qt6 COMPONENTS Core Gui Widgets REQUIRED)


set(MySQL_CONNECTOR_CPP_ROOT "C:/Program Files/MySQL/MySQL Connector C++ 9.0")


include_directories("${MySQL_CONNECTOR_CPP_ROOT}/include")
include_directories("${MySQL_CONNECTOR_CPP_ROOT}/include/jdbc")
include_directories("${MySQL_CONNECTOR_CPP_ROOT}/include/jdbc/cppconn")


link_directories("${MySQL_CONNECTOR_CPP_ROOT}/lib64/vs14")


add_executable(fajnensapp main.cpp)

# Link against Qt and MySQL Connector/C++
target_link_libraries(fajnensapp
Qt::Core
Qt::Gui
Qt::Widgets
mysqlcppconn
mysqlcppconnx
)


if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
set(DEBUG_SUFFIX)
if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
set(DEBUG_SUFFIX "d")
endif ()
set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
endif ()
endif ()
if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
endif ()
foreach (QT_LIB Core Gui Widgets)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${QT_INSTALL_PATH}/bin/Qt6${QT_LIB}${DEBUG_SUFFIX}.dll"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>")
endforeach (QT_LIB)
endif ()

 

 

I greška koju dobijem je

 

FAILED: fajnensapp.exe
cmd.exe /C "cd . && C:\PROGRA~1\JETBRA~1\CLION2~1.2\bin\mingw\bin\G__~1.EXE -g  CMakeFiles/fajnensapp.dir/main.cpp.obj -o fajnensapp.exe -Wl,--out-implib,libfajnensapp.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -LC:/PROGRA~1/MySQL/MYSQLC~1.0/lib64/vs14 -lmysqlcppconn  -lmysqlcppconnx  C:/Qt/6.7.2/mingw_64/lib/libQt6Widgets.a  C:/Qt/6.7.2/mingw_64/lib/libQt6Gui.a  C:/Qt/6.7.2/mingw_64/lib/libQt6Core.a  -lmpr  -luserenv  -ld3d11  -ldxgi  -ldxguid  -ld3d12  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cmd.exe /C "cd /D C:\Users\jcanic\CLionProjects\fajnensapp\cmake-build-debug && "C:\Program Files\JetBrains\CLion 2023.3.2\bin\cmake\win\x64\bin\cmake.exe" -E make_directory C:/Users/jcanic/CLionProjects/fajnensapp/cmake-build-debug/plugins/platforms/ && cd /D C:\Users\jcanic\CLionProjects\fajnensapp\cmake-build-debug && "C:\Program Files\JetBrains\CLion 2023.3.2\bin\cmake\win\x64\bin\cmake.exe" -E copy C:/Qt/6.7.2/mingw_64/plugins/platforms/qwindows.dll C:/Users/jcanic/CLionProjects/fajnensapp/cmake-build-debug/plugins/platforms/ && cd /D C:\Users\jcanic\CLionProjects\fajnensapp\cmake-build-debug && "C:\Program Files\JetBrains\CLion 2023.3.2\bin\cmake\win\x64\bin\cmake.exe" -E copy C:/Qt/6.7.2/mingw_64/bin/Qt6Core.dll C:/Users/jcanic/CLionProjects/fajnensapp/cmake-build-debug && cd /D C:\Users\jcanic\CLionProjects\fajnensapp\cmake-build-debug && "C:\Program Files\JetBrains\CLion 2023.3.2\bin\cmake\win\x64\bin\cmake.exe" -E copy C:/Qt/6.7.2/mingw_64/bin/Qt6Gui.dll C:/Users/jcanic/CLionProjects/fajnensapp/cmake-build-debug && cd /D C:\Users\jcanic\CLionProjects\fajnensapp\cmake-build-debug && "C:\Program Files\JetBrains\CLion 2023.3.2\bin\cmake\win\x64\bin\cmake.exe" -E copy C:/Qt/6.7.2/mingw_64/bin/Qt6Widgets.dll C:/Users/jcanic/CLionProjects/fajnensapp/cmake-build-debug""
C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: CMakeFiles/fajnensapp.dir/main.cpp.obj: in function `check_lib':
C:/Program Files/MySQL/MySQL Connector C++ 9.0/include/jdbc/cppconn/driver.h:85: undefined reference to `check(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:/Program Files/MySQL/MySQL Connector C++ 9.0/include/jdbc/cppconn/driver.h:86:

 

undefined reference to `check(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)'


collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

 

Nije mi baš jasno di sad zapne

 

Ok očito tu

 

inline static void check_lib()
{
check(std::string{});
check(std::map<std::string,std::string>{});
}

 

Ali ne kužim zašto.

 

Hvala unaprijed ako se netko borio s tim pa bi mogao pomoć

 
0 0 hvala 0
15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Dakle, ti dobiješ error prilikom linkanja. Linker ne može naći implementaciju te funkcije u libraryjima koje linkaš.

 

E sad zašto, nisam siguran. Koliko vidim na MySQL dokuemntaciji, ti si linkao dobre libove, imaš ovo u naredbi za build -lmysqlcppconn  -lmysqlcppconnx, a tu bi ti već puknulo da ih nije našao (valjda).

 

Longshot, ali koliko vidim taj driver.h je iz jdbca (C:/Program Files/MySQL/MySQL Connector C++ 9.0/include/jdbc/cppconn/driver.h:85: undefined reference to `check(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), a u dokumentaciji od MySQL-a piše ovo:

 

 

 

Moguće da te funkcije uopće nisu implementirane tu, jer to legacy api, a i gore piše also implemented in earlier versions of the connector.

 

E sad ako je ovo točno, to znači da moraš maknuti ovo:
#include <driver.h>

 

Iako ti ne koristiš legacy api, ti si uključio header iz JDBC apia koji nije implementiran, a tu se negdje pozove check_lib() i onda linker traži taj simbol.

 

EDIT: zapravo nisam siguran da ne koristiš legacy api, jer primjer ovdje izgleda mrvicu drugačije (malo se drugačije funkcije zovu), pa provjeri i to.

 

EDIT2: Makni i ovo, pa vidi ako dobiješ errore. S obzirom da si krenuo od nule, rješi se odmah tog jdbcaa jer je za MySQL to legacy očito.

include_directories("${MySQL_CONNECTOR_CPP_ROOT}/include/jdbc")
include_directories("${MySQL_CONNECTOR_CPP_ROOT}/include/jdbc/cppconn")

 

Poruka je uređivana zadnji put pet 9.8.2024 16:27 (captain_soap_McTawish).
Nova poruka
E-mail:
Lozinka:
 
vrh stranice