Windows’ta UNIX Gibi Geliştirmenin Sorunları – mingw
18 Temmuz 2008Önceki yazımda bahsetmiş olduğum şifreleme yazılımını Windows’ta derledikten sonra çalışma zamanında karşılaştığım bazı problemler ve çözümlerinden bahsetmek istiyorum. Belki sizlerin de işine yarar.
Karşılaşmış olduğum bu sorunları; Windows’ta 64 bit tamsayı gösterimi sorunları, Dosyaların olduğundan kısa okunup kısa yazılması ve Qt ile klasör seçiminin UNIX gibi görünmesi gibi 3 başlık altında toplayabiliriz.
- Windows’ta 64 bit tamsayı gösterimi sorunları.
Şifreleme yazılımında 64 bit olması gereken sayısal bir değeri standart olması (c89) için “long long” türünde tanımlamış ve kullanmıştım. Bu değerin görüntülenmesi için snprintf’e format string’i olarak “%lld” vermiştim. Linux’te gayet güzel çalışıyordu. Windows’ta da sorunsuz derlendi. Ancak çalışma anına gelince değer 2 milyarın üzerine çıktıktan bir süre sonra negatife dönüştü.Yaptığım araştırmalar sonucunda “long long” türü 64 bit olarak c89 standardında tariflenmiş. Bu standarda Microsoft da uymuş. Ama bu “long long“un bir “*printf” ve “*scanf” işlevlerinde kullanılabilecek bir format string’i standarda bağlanmamış. Microsoft da kendisi “%I64d” biçiminde bir format kullanmış. c99 standarı yayınlandığında “%lld” format string’i “long long” türü için format string’i olduğu kabul edilmiş. Buna herkes uyarken Microsoft eskiye dönük uyumlu olmayı ve nasıl olsa bu işi yapan bir format string’im var mantığı ile “%I64d” format string’ini kullanmaya devam ederek yeni standarda uymamış.
Özet olarak Windows’taki “*printf” ve “*scanf” işlevlerinde 64 bit bitlik “long long” türünü kullanmak istediğinizde format string’ine dikkat etmek gerekir.
- Dosyaların olduğundan kısa okunup kısa yazılması.
Linux’te geliştirmiş olduğum uygulamalarda dosyaları hep “open()” işlevi ile açarım. Windows’ta da aynı “open()” işlevini kullandığımda dosyalar aynı şekilde açılıyor. Ancak “read()” ve “write()” işlevlerinde bazı dosyalarda hata alınıyor. Sorunun sadece binary dosyalarla ilgili olduğunu keşfedince, Windows ortamındaki “open()” işlevinin “O_BINARY” bayrağının kurulu olması zorunluluğu olduğunu, bu bayrağın kurulmazsa binary dosyalarda sorun çıkartacağı belirtilmiş. “O_BINARY” bayrağını kurarak “open()” işlevi ile dosya açtığımda “read()” ve “write()” işlevleri aynı Linux’teki gibi davrandılar. Windows’ta “open()” sırasında “O_BINARY” bayrağını kurmayı unutmamak gerek. - Qt ile klasör seçiminin UNIX gibi görünmesi.
Qt ile klasör seçim penceresini açtıktan sonra döndürdüğü değer kullanıcının seçtiği klasörün tam yoludur (ing. absolute path). Ancak tüm klasör ayıraçları “\” yerine sanki UNIX sistemiymiş gibi “/” şeklindeydi. Buna parametrik bir çözüm bulamadım ve tüm “/“ları “\“a dönüştürerek kullandım.
Buna benzer başka sorunlarla karşılaştıkça yazmaya çalışacağım. Dikkatli olmak gerek. Windows ortamı standart dışı bir ortam. Microsoft’un standartlara uymak yerine kendi kafasına göre değişik uygulamaları var. Bir gün sizin de karşınıza çıkabilir.