PDA

Tam Sürümünü Görmek İçin : C kodları derleme


Mr_MOON
04/12/2005, 19:53
Merhaba.
Öncelikle şunu söyleyimki C++ konusunda ortayla başlangıç arasında bi yerdeyim.İnternet ten bulduum bazı hazır kodlarla oynayarak kendime göre bişeler çıkartmaya çalışıorum.
Şimdi sorunum şu gene nette bulduum bir C kodunu derlemek için Visual C++ yada borland C++ kullanılabilirmi.
Visual C++ da C/C++ header file bölümünden giriş yapıp kodları derliyorum.Kodlarda hata yok.Fakat build dediğimde Program çalışmıyo çalışmama sebebi ise açık.Program exe yi oluşturmuyo.Yani anlıycağınız sadece .c ve .h dosyalarıyla sap sap boğuşuyorum.Farklı bir derleyici önerirmisiniz yada Visual C++ da C kodlarını nasıl derleyebileceğim hakkında bilgi verirseniz çok memnun olurum.

Şunuda belirtiyimki C hakkında bilgim yok.

Cevaplarınız ve ilginiz için şimdiden teşekkürler.


acehreli
04/12/2005, 20:38
C kodlari cok buyuk olasilikla C++ derleyicisinde derlenebilir. Derleme hatalari da genellikle kucuk degisikliklerle asilabilir. Tam olarak ne hatalar aliyorsun?

Ali

Mr_MOON
04/12/2005, 20:46
Sewgili Ali Öncelikle ilgin için teşekkür ediyorum.

Dediğim gibi kodları düzenlemede bir hata almıyorum.Hatta Visual C++ da derlediğim zaman 0 errors 0 warnings yazısıda çıkıyo :)

Ama build dediğimde exe yi oluşturup programı çalıştırmıyo.
Ama C++ kodlarında hiç bir sorun yok.Gayet iyi çalıştırıyo.
Yoksa ben Visual C++ da yanlış bölüme giriptemi derliyorum kodları.İlk mesajımda dediğim gibi c/c++ header files bölümünden giriyorum.C++ source files tan girdiğimde 29 tane hata verio :)
Ne yapcam şaşırdım.
C kodlarını derlemek için quickC die bir şey duydum ama bulamadım.

acehreli
04/12/2005, 21:20
Tam olarak ne hata aliyorsun derken o 29 hatanin ne olduklarini ogrenmek istemistim. Yoksa tahminden oteye gidemeyiz :)

Ali

Sabahi
04/12/2005, 23:28
Ali arkadasinda soyledigi gibi hatalarin ne oldugunu yazmazsaniz dogru bir cevap vermek cok zor. Yinede yaygin bir derleme hatasi (Visual C++ icin) C programlarinin .cpp olarak derlenmesinden ve/veya C++ projelerinin C kodu ile karisik olarak kullanildigindan kaynaklanir. Eger programin tamamini C olarak derliyorsaniz ve projeye source file(diyelimki "main" olsun) eklediginizde sadece main olarak isimlendirirseniz Visual C++ derleyicisi otomatikman dosya ismini .cpp olarak kabul edecektir. Bunun onune gecmek icin isim verirken "main.c" diye dosya uzantisi ile yazarsaniz bu problemi cozersiniz. Eger projeniz C++ ise ve bu proje icerisinde C fonksiyonlari kullanmak istiyorsaniz bu kodlarin extern C olarak kullanilmasi gerekir.

Mr_MOON
07/12/2005, 22:13
Arkadaşlar işte hatalar
Ali maili gönderdim sana cevap yazarsan sewinirim.

Compiling...
Cpp1.cpp
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(67) : error C2065: 'DATA_BLOB' : undeclared identifier
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(67) : error C2146: syntax error : missing ';' before identifier 'blobCrypt'
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(67) : error C2065: 'blobCrypt' : undeclared identifier
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(67) : error C2065: 'blobPlainText' : undeclared identifier
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(67) : error C2065: 'blobEntropy' : undeclared identifier
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(113) : error C2228: left of '.pbData' must have class/struct/union type
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(114) : error C2228: left of '.cbData' must have class/struct/union type
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(116) : error C2228: left of '.pbData' must have class/struct/union type
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(117) : error C2228: left of '.cbData' must have class/struct/union type
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(119) : error C2065: 'CryptUnprotectData' : undeclared identifier
C:\Documents and Settings\Mr.MOON\Desktop\Yeni Klasör\Cpp1.cpp(122) : error C2228: left of '.pbData' must have class/struct/union type
Error executing cl.exe.

acehreli
08/12/2005, 00:43
Kisa yanit: derleyici, kullandigin noktada DATA_BLOB'un ne oldugunu bilmiyor.

Uzun geveleme: C'de ve C++'ta kod icinde kullanilan her bir belirtecin (identifier) (veya "ad"In) o ana kadar bildirilmis olmasi gerekir.

Tek bir hatanin zincirleme olarak cok sayida hata mesajina neden olmasi da cok gorulen bir olaydir. Birinci hata giderilip kod tekrar derlendiginde bazen o ikincil hatalar da ortadan kalkarlar.

Derleyicinin derlemek icin eline verilen kod, bizim yazdigimiz kodun onislemciden (preprocessor) gecmis halidir. En cok kullanilan onislemci komutu ("directive" yerine kullaniyorum) #include'dur. O satir, baska kod satirlarini kendi kodumuz icine almamizi saglar.

Zaten o sayede ornegin printf'in ne oldugunu her derleme biriminde bildirmek zorunda kalmayiz. #include <stdio.h> satiri ile onun bildirilmis oldugu <stdio.h> basligini "#include eder" ve printf'in bildirimini, printf'i kullandigimiz ilk satirdan onceye almis oluruz.

(Aslinda <stdio.h> eklenmedigi halde printf'i kullanmaya izin veren derleyiciler iyilik degil, kotuluk yapiyorlar.)

Yani, DATA_BLOB'u kullanmadan once DATA_BLOB'i bildiren (hatta bu durumda "tanimlayan") satiri da koduna eklemen gerekiyor. Tahminime gore, kullandigin kutuphanenin belgelerinde belirtilmesi olasi bir basligi eklemeyi unutuyorsun.

Ali

Sabahi
08/12/2005, 07:33
acehrelinin yazdiklarina ek olarak Cpp1.cpp adinda derlemek yerine Cpp1.c ismi ile derlerseniz iyi olur.

Mr_MOON
08/12/2005, 20:54
Dediklerinizi anladım. Programdakiler bunlar

#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>

Bunlardan başka hangilerini tanımlamam gerekir?

Bu arada sewgili sabahi dosya uzantısını c yaparken sadece farklı kaydet bölümünden değiştirmem yeterlimi ilgin için saol.

acehreli
08/12/2005, 21:40
Rap_Boy, biz hangi basliklari eklemen gerektigini bilemeyiz. Onlari, kullandigin kutuphanenin belgelerinden ogreneceksin. "DATA_BLOB'i kullanarak su isleri halledebilirsiniz" diyen hangi belgeyse veya kisiyse, oradan "DATA_BLOB hangi baslikta tanimlidir?" sorusuna yanit bulman gerekiyor.

Hizlica yaptigim aramayla buldugum su sayfada anlatilanlara bakilirsa

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/seccrypto/security/_includes_and__defines.asp

MSDN'deki butun orneklerin su satirlari icerdikleri varsayiliyormus:

#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

Belki senin icin cozum de MY_ENCODING_TYPE makrosudur. (?)

Ali

Sabahi
09/12/2005, 06:50
Rap_Boy,
farkli kaydet bolumu ne demek bilmiyorum, belki MS Visual C++ in turkcelestirilmis olanini kullaniyorsunuz ondan anlamadim. Yinede MS Visual C++ 6.0 ya gore nasil proje hazirlanir tarif etmeye calisayim umarim isinize yarar.

Derleyiciyi calistirdiktan sonra, File/New deyin ve acilan pencerede Projects sekmesinden amaciniza uygun projeje turunu (Win32 Application yada Win32 Console Application ) secip Project name text box a programiniza vermek istediginiz ismi yazin ve projenizi saklamak istediginiz yeri degistirmek isterseniz
Location: text box in yanindaki kare seklindeki dugmeye tiklayarak arzu ettiginiz yeri secin ve OK dugmesine tiklayin. Karsiniza acilan yeni pencerede An empty project seceneginin secilmis olmasina dikkat edin ve finish dugmesine tiklayin. Karsiniza bilgi verme amacli yeni bir pencere acilir OK dugmesine tiklayin. Bu noktada projemiz hazir ve sira source(kaynak) ve header(baslik?) dosyalarini eklemeye geldi. Tekrar File/New deyin ve Files sekmesinden "C++ source file" secenegini secip File name text box a dosyaniza vermek istedigini ismi uzantisi ile (Cpp1.c mesela)yazin ve OK e tiklayin. Ayni sekilde header dosyalarinida ekliyebilirsiniz sadece "C++ Source" yerine "C/C++ Header File" secenegini secmek yeterli.