Pardus: GCC 4.3'e geçiş

PardusWiki, özgür ansiklopedi

Git ve: kullan, ara

Belgenin özgün hali: http://gcc.gnu.org/gcc-4.3/porting_to.html

GCC 4.3 sürümü GCC'nin önceki sürümlerine nazaran daha köklü değişiklikler getirmektedir. Bu değişikliklerin bazıları hata giderme çalışmalarının sonucudur ve bazı eski davranışlar yeni standartları desteklemek veya derleme veya çalışma anı performansını arttırmak amacıyla bilinçli olarak değiştirilmiş veya standartlara uygun şekilde gevşetilmiştir. Bu değişiklerin bazıları bariz değildir ve eski GCC sürümlerinden yükseltirken problem çıkarmaz.

Ancak bu değişikliklerin bazıları çok barizdir ve kaynak kodlarını GCC 4.3'e yükseltmeye çalışan kullanıcıyı uğraştırabilir. Bu belge bu tür değişiklikleri ve çözümlerini pratik bir şekilde sunmayı amaçlamaktadır. Belgeye yapılmasını istediğiniz eklemeleri ve önerilerinizi bize bildirebilirsiniz.

Konu başlıkları

[değiştir] C dili konuları

[değiştir] extern inline cümle yapısı değişikliği

-std=c99 veya -std=gnu99 ile derlerken, extern inline anahtar kelimeleri farklı anlama gelir. GCC 4.3 ISO C99'da GNU extern inline eklentisinden çok farklı olan ISO C99 belirtimiyle uyumludur. -std=c99 ile derlenen

extern inline int
foo()
{ return 5; }

kodu sonraki nesne dosyasında foo fonksiyon tanımının yayımlanmasını sağlar; oysa önceden böyle birşey yoktu. Sonuç olarak, bu eklentiyi kullanan ve C99 leçhesinde (dialect) derlenen dosyalarda birden fazla nesne dosyası birbirine bağlanırken şu şekilde pek çok hata mesajı görünür:

multiple definition of `foo'
first defined here

Eski GNU extern inline davranışı isteniyorsa, extern inline __attribute__((__gnu_inline__)) kullanılabilir. Bu özniteliğin kullanımı inline ISO C99 davranışını kullandığında tanımlı durumda bulunan bir makro olan #ifdef __GNUC_STDC_INLINE__ ile korunabilir.

Buna göre değiştirilmiş kod şöyle görünür:

extern inline __attribute__((__gnu_inline__)) int
foo()
{ return 5; }

[değiştir] Yeni uyarılar

-Wconversion'da mühim değişiklikler yapıldı. Ek olarak, GCC altyapısındaki iyileştirmeler problemli kodu tespit edilmesiyle ilgili gelişmeler sağlıyor. -Wuninitialized, , -Wstrict-aliasing , -Wunused-function, -Wunused-variable kullanan ve önceden uyarı vermeyen kod için yeni uyarı mesajlarıyla karşılaşabilirsiniz. -Wall parametresinin bu uyarı bayraklarının çoğunu kapsadığını hatırlatmış olalım.

Bu uyarılar derlemenin başarısız olasına neden olmaz, ancak -Wall genellikle -Werror ile birlikte kullanıldığı için bu yeni uyarılar yeni hatalar olarak da görülebilir.

Çözüm, yeni uyarılar oturtulana kadar -Werror kullanmamak, veya dönüştürme uyarıları için -Wno-conversion ekleyin.

[değiştir] C++ dili konuları

[değiştir] Başlık (Header) bağımlılık temizliği

Burada etraflıca anlatıldığı üzere, standart C++ kütüphanesi içerme (include) dosyası mümün olan en az sayıda ek dosya içerecek şekilde değiştirildi. Bunun sonucu olarak, <cstring> içermeden std::memcpy ve <memory> içermeden std::auto_ptr kullanan çok sayıdaki C++ programı derlenmeyecektir.

Bu durumda, genellikle şöyle bir mesaj alırsınız:

error: 'strcmp' was not declared in this scope

Aşağıdaki tablo kayıp öğelerin bir kısmını ve derlemenin başarılı olması için gereken #include ifadelerini listeler.

Şu kayıpsa Şu başlığı içer
find, for_each, sort <algorithm>
ostream_iterator, istream_iterator <iterator>
auto_ptr <memory>
typeid <typeinfo>
isalnum, toupper <cctype>
INT_MIN, INT_MAX, RAND_MAX <climits>
printf <cstdio>
atoi, free, rand, exit <cstdlib>
EXIT_FAILURE <cstdlib>
strcmp, strdup, strcpy, memcpy <cstring>

[değiştir] ISO-öncesi başlıkların silinmesi

Geriye doğru uyumluluk için tutulan veya artık geçerliliği kalmayan başlık başlıklar silindi.

Şu kayıpsa Şu başlığı içer
<algobase.h> <algorithm>
<algo.h> <algorithm>
<alloc.h> <memory>
<bvector.h> <vector>
<complex.h> <complex>
<defalloc.h> <memory>
<deque.h> <deque>
<fstream.h> <fstream>
<function.h> <functional>
<hash_map.h> <tr1/unordered_map>
<hashtable.h> <tr1/unordered_map> veya <tr1/unordered_set>
<heap.h> <queue>
<iomanip.h> <iomanip>
<iostream.h> <iostream>
<istream.h> <istream>
<iterator.h> <iterator>
<list.h> <list>
<map.h> <map>
<multimap.h> <map>
<multiset.h> <set>
<new.h> <new>
<ostream.h> <ostream>
<pair.h> <utility>
<queue.h> <queue>
<rope.h> <ext/rope>
<set.h> <set>
<slist.h> <ext/slist>
<stack.h> <stack>
<streambuf.h> <streambuf>
<stream.h> <iostream>
<tempbuf.h> <ext/memory>
<tree.h> <ext/rb_tree> veya <ext/pb_ds/assoc_container.hpp>
<vector.h> <vector>

Güncel başlıklar burada.

Bir örnek.

 #include <iostream.h>
 
 int main()
 {
   cout << "I'm too old" << endl;
   return 0;
 }
 

Önceki derleyicilerle derlemek şunu verir:

warning: #warning This file includes at least one deprecated or
antiquated header. Please consider using one of the 32 headers found
in section 17.4.1.2 of the C++ standard. Examples include substituting
the <X> header for the <X.h> header for C++ includes, or 
<iostream> instead of the deprecated header
<iostream.h>. To disable this warning use -Wno-deprecated.

Artık şu çıktıyı verir:

error: iostream.h: No such file or directory
In function 'int main()':
6: error: 'cout' was not declared in this scope
6: error: 'endl' was not declared in this scope

Bu durumu düzelmek basittir:

 #include <iostream>
 using namespace std;
 
 int main()
 {
   cout << "I work again" << endl;
   return 0;
 }
 

Ayrıca, std aduzayını (namespace) dahil etmeden cout yerine std::cout vermek ve aynısını endl için de uygulamak da işe yarar.

[değiştir] Ad arama (lookup) değişiklikleri

GCC şu ve benzeri kodları öntanımlı davranış olarak artık kabul etmez:

template <class _Tp> class auto_ptr {};
template <class _Tp>
struct counted_ptr
{
  auto_ptr<_Tp> auto_ptr();
};

ve şu hatayı verir

error: declaration of 'auto_ptr<_Tp> counted_ptr<_Tp>::auto_ptr()'
error: changes meaning of 'auto_ptr' from 'class auto_ptr<_Tp>'

Burada ya auto_ptr yapısına (struct) verilen referans kısıtlandırılmalıdır ya da üye fonksiyonun (member function) adı başka hiçbir adla çalışmayacak şekilde değiştirilmelidir.

template <class _Tp> class auto_ptr {};
template <class _Tp>
struct counted_ptr
{
  ::auto_ptr<_Tp> auto_ptr();
}; 

Ek olarak, kod düzeltilene kadar bu hatayı bir uyarı haline getirmek için geçici bir çözüm olarak -fpermissive kullanılabilir. Ancak bu durumda ad aramasının standart dışı olduğu unutulmamalıdır.

[değiştir] Çift (Duplicate) fonksiyon parametreleri

Çift fonksiyon parametreleri artık hem C'de hem de C++'da hata olarak değerlendirilir.

void foo(int w, int w);

Şimdi hem C'de hem de C++'da metni değiştirilmiş olan aşağıdaki hatayı verir:

error: multiple parameters named 'w'

Düzeltmek için, parametrelerden birinin adını değiştirin.

void foo(int w, int w2);

[değiştir] Fonksiyon ana imzası için daha katı gereklilikler

main fonksiyonunun iki parametreli imzasının ilk parametresi int olmalıdır. GCC 4.3 bunu zorunlu kılar.


int main(unsigned int m, char** c)
{ return 0; }

Şunu verir:

error: first argument of 'int main(unsigned int, char**)' should be 'int'

Bunu düzeltmek basittir. ilk parametreyi unsigned int değil int olarak vermelisiniz. Şöyle olmalı:

int main(int m, char** c)
{ return 0; }

[değiştir] Sarih (explicit) şablon (template) ihtisasının (specialization) bir depo sınıfı (storage class) olamaz.

Şablonların ihtisasları bir depo sınıfı belirtemez ve ana şablonla aynı depoda olurlar. Bu eski davranıştan farklıdır ve ISO C++ Çekirdek Kusur Raporu (Core Defect Report) 605'e gelen geridönütleri ve yorumları temel alır.

template<typename T>
  static void foo();

template<>
  static void foo<void>();

Şunu verir:

error: explicit template specialization cannot have a storage class

Bu extern belirtecinde de olur. Düzeltmek basittir: ihtisasdaki depo belirteçlerini silin:

template<typename T>

  static void foo();

template<>
  void foo<void>();

[değiştir] Java konuları

[değiştir] Java 1.2 ve öncesi yükseltilmiş ant gerektirir

GCC 4.3'te Eclipse Java derleyicisinin kullanılması tüm Java 1.5 dil özelliklerinin kullanımına imkân tanır, ama ant inşa aracının eski sürümleriyle kullanmak problemlidir. Bu tür hatalar genellikle şuna benzer:

[javac] source level should be comprised in between '1.3' and '1.6' (or '5', '5.0', ..., '7' or '7.0'): 1.2

GCC ile eski Java lehçelerinin (dialect) sorunsuz kullanılabilmesi için, lütfen bu yamayı kullanın:

svn diff -r529854:529855 http://svn.apache.org/repos/asf/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java

[değiştir] Bağlantılar

Jakub Jelinek, Mass rebuild status with gcc-4.3.0-0.4 of rawhide-20071220 (rawhide-20071220'nin gcc-4.3.0-0.4 ile toplu inşası)

Martin Michlmayr, GCC 4.3 related build problems (GCC 4.3'le ilgili inşa problemleri)

Brian M. Carlson, GCC 4.3: Declaration of...Changes Meaning of... (... İlânı .. Anlamını Değiştirir)

Simon Baldwin, [PATCH[RFC] C++ error for parameter redefinition in function prototypes ] (Fonksiyon prototiplerinde parametre yeniden tanımlama C++ hatası)

Simon Baldwin, [REVISED PATCH[RFC] Fix PR c++ /31923: Storage class with explicit template specialization ] (Sarih Şablon İhtasısıyla Depo Sınıfı)