Moi.
Olen tekemässä pienenä projektina yksinkertaista IDE:ä. Nyt olen kirjoittanut muistiolla yksinkertaisen koodin:
// hello.cpp #include <iostream> using namespace std; int main() { cout << "Hello World!\n"; cin.get(); return 0; }
Ja yritän kääntää sen seuraavasti:
#include <iostream> int main() { system("cd C:\\bin\\MinGW\\bin"); system("g++ -o C:\\Testi2.exe \"C:\\Documents and Settings\\Järjestelmävalvoja\\Työpöytä\\Testi\\hello.cpp\""); std::cin.get(); return 0; }
MinGW valittaa siitä, kuinka se ei löydä iostream -kirjastoa. Miten saan MinGW:n hakemaan otsikkotiedostot omasta kansiostaan?
Uskoakseni otsikoille parametrilla -IC:\\mingw\\include
ja kirjastoille vastaavasti -LC:\\mingw\\lib
Mihin nuo parametrit tulisi sijoittaa?
Minulla toimii seuraavanlainen ohjelma, josta otin nuo polkuhärdellit pois. Onko muuten sinun koneessasi tuo polku varmasti oikein? Minulla on Järjestelmänvalvojassa yksi n-kirjain enemmän.
Helloworld kuten yllä.
#include <iostream> int main() { // system("cd C:\\bin\\MinGW\\bin"); system("c++ -o hello hello.cpp"); std::cin.get(); return 0; }
En tiedä mitä eroa g++ ja c++ -komennoilla on (jos mitään). Joka tapauksessa voisit ensin testata ilman polkuja. Muista laittaa kaikki samaan hakemistoon. Saatko saman virheilmoituksen?
Minulla on ihan tavallinen MinGW:n asennus + Cygwin systeemissä. Katsoin kyllä which-komennolla, että se käyttää MinGW-hakemiston kääntäjiä. Versionro on 3.4.2 .
EDIT: Testaapa system("dir");
cd-komennon jälkeen. Hakemiston vaihtaminen ei välttämättä toimi noin ollenkaan.
En nyt haluaisi puuttua pikkuasioihin koska pilkunnussijoista ei tykätä, mutta
käsittääkseni toi iostream on header tiedosto eli se otetaan käyttöön
#include <iostream.h>
Mikäli onglema korjaantui tällä, niin täältä on sitten hyvä jatkaa:
http://www.nic.funet.fi/c opas/perusteet.html :)
Mushi kirjoitti:
käsittääkseni toi iostream on header tiedosto eli se otetaan käyttöön
#include <iostream.h>
Ei vaan nimenomaan pelkkä <iostream>. <iostream.h> on vanhentunut, kuten myös osittain tuo opas.
Kopeekka kirjoitti:
Onko muuten sinun koneessasi tuo polku varmasti oikein? Minulla on Järjestelmänvalvojassa yksi n-kirjain enemmän.
Minulla se on ihan vain Järjestelmävalvoja. :)
Kopeekka kirjoitti:
En tiedä mitä eroa g++ ja c++ -komennoilla on (jos mitään). Joka tapauksessa voisit ensin testata ilman polkuja. Muista laittaa kaikki samaan hakemistoon. Saatko saman virheilmoituksen?
Tulee tismalleen sama.
Kopeekka kirjoitti:
Testaapa system("dir"); cd-komennon jälkeen. Hakemiston vaihtaminen ei välttämättä toimi noin ollenkaan.
Hakemisto vaihtui niinkuin pitikin.
Ja jos käytän Metaboliksen ilmoittamaa parametriä näin:
system("g++.exe -I \"C:\\bin\\MinGW\\include\\c++\\3.4.2\" -o C:\\Testi2.exe \"C:\\Documents and Settings\\Järjestelmävalvoja\\Työpöytä\\Testi\\hello.cpp\"");
Sieltä tulee noin 150 rivin pituinen liuta lisää virheitä. :|
Kokeilepa jos otat tuon välin pois I:n jälkeen... Tai lopetat includeen ja jätät tuon c++\3.4.2-osan pois.
I:n jälkeisen välin poistaminen ei vaikuttanut tulokseen, ja jos tuon c++\3.4.2-osan jättää pois, kääntäjä ilmoittaa, että sitä tiedostoa ei löydy.
system("cd xxx") käskyllä ei taida olla pitkäaikaista vaikutusta. Epäilisin, että jokainen system-kutsu suoritetaan omassa konsolissaan.
Testaa esim.
#include <iostream> int main() { system("cd .."); system("cd"); std::cin.get(); return 0; }
Toiseksi ongelmat voivat johtunua noista polkuhässäköistä. Kuten Kopeekka sainoi, ilman noita polkuja tuo toimi ihan kunnolla. Esimerkiksi ääkköset ja välilöynnit hakemistopoluissa aiheuttavat toisinaan erinäisiä ongelmia, vaikka polut olisivatkin sulkujen sisällä. Kokeile yksinkertaisempien polkujen kanssa.
Sweiz kirjoitti:
Kopeekka kirjoitti:
Saatko saman virheilmoituksen?
Tulee tismalleen sama.
Tämäpä merkillistä. Nyt tulee villi arvaus, mutta käsittääkseni MinGW käyttää systeemissä muuttujaa nimeltä MINGDIR, jonka on oltava kääntäjän hakemisto. Minulla on esim. MinGW-hakemsto suoraan c:-aseman juuressa ja MINGDIR on siten c:\MinGW
.
Nyt voi olla niin, että kun ajat system-kutsun kautta komentoja, ne suoritetaan ympäristössä, jossa tuo muuttuja ei ole voimassa ja siksi kääntäjä ei löydä otsikoitaan tai kirjastojaan. Mutta tämä ei ole tietoa vaan arvailua. Joka tapauksessa voit testata sitäkin.
Nämä muuttujat näkee antamalla pelkkä komento set
komentorivillä (tai system-kutsussa). Niitä voi vaihtaa Oma Tietokone -toiminnon piilotetusta alivalikosta nimeltä Ympäristömuuttujat toimimaan kaikkialla. MinGW:n asennus kyllä laittoi tuon muuttujan sinne oikeaan paikkaan, jos toimi yhtään samalla tavalla kuin minulla.
Sweiz kirjoitti:
Kopeekka kirjoitti:
Testaapa system("dir"); cd-komennon jälkeen. Hakemiston vaihtaminen ei välttämättä toimi noin ollenkaan.
Hakemisto vaihtui niinkuin pitikin.
Minulla ei käy niin WinXP-koneessani - tai tarkemmin sanottuna vaihto on voimassa vain sen yhden system-kutsun aikana, ja ohjelman oletushakemisto pysyy samana. Syykin on varmasti tuo FooBatin kertoma. Et voi luottaa, että ohjelmasi toimisi muualla, jos teet noin. Enkä valitettavasti osaa neuvoa parempaa tapaa tähän hätään. Luultavasti oikea tapa on käyttöjärjestelmäkohtainen.
Sweiz kirjoitti:
Sieltä tulee noin 150 rivin pituinen liuta lisää virheitä. :|
Voisit näyttää meillekin pari ensimmäistä, niin tietäisimme, mistä tällä kertaa on kyse.
No, jos nyt on niin, että antamani yksinkertaistettu ohjelmakaan ei toiminut, syy ei ole pelkästään komennossa annetuissa poluissa. Vikaa pitää etsiä siitä miksi meidän koneissamme toimii kääntäjän ajaminen system-kutsun kautta eri tavalla. En nyt osaa enää arvatakaan yllä sanomani lisäksi mitään.
Jokin mättää ja pahasti käytettäessä C++:n kirjastoja. Sama koodi kirjoitettuna C:llä (linkitettävänä kirjastona stdio.h) toimii hyvin.
kopeekka kirjoitti:
Voisit näyttää meillekin pari ensimmäistä, niin tietäisimme, mistä tällä kertaa on kyse.
Kääntäjä ei löydä mitään niistä kirjastoista, jotka linkitetään iostream.h
:n kautta.
EDIT:
lainaus:
system("cd xxx") käskyllä ei taida olla pitkäaikaista vaikutusta.
Okei, kiitos huomautuksesta. :) Koodinhan voi kääntää myös seuraavasti:
system("C:\\bin\\MinGW\\bin\\g++.exe -I \"C:\\bin\\MinGW\\include\" -o C:\\Testi2.exe \"C:\\Documents and Settings\\Järjestelmävalvoja\\Työpöytä\\Testi\\hello.c\"");
Yksi mahdollisuus voisi olla kirjoittaa ajettavista komennoista bat-tiedosto ja ajaa tämä system-kutsulla, jolloin sen sisällä voisi käyttää vapaasti PATHia sun muuta.
const char *batpolku = "komennot.bat"; void kaanna(char *koodi) { std::ofstream bat(batpolku); bat << "SET PATH=C:\\bin\\MinGW\\bin" << std::endl; bat << "g++ " << kooditiedosto << " -o tulos.exe" << std::endl; bat.close(); system(batpolku); }
Aihe on jo aika vanha, joten et voi enää vastata siihen.