gcc: Linking Error: undefined reference to ‘tan’ Sorununun Çözümü

Not: Sorun her ne kadar “tanjant” fonksiyonu üzerinden anlatılmışsa da diğer kütüphanelerle ilgili çıkan aynı sorunların çözümü içinde kullanılabilir. Burada sadece “tanjant” fonksiyonu örnek alınarak anlatılmıştır.

#include <stdio.h>
#include <math.h>

int main(){
    int x = 45;
    double sonuc = tan(x);
    printf("Sonuc: %d", sonuc);
}

Yukarıdaki kodu hesap.c olarak kaydedip aşağıdaki gibi derlediğimizde:

$ gcc hesap.c -o hesap

aşağıdaki bağlama(linking) hatasını alırız:

/tmp/ccOTnqUQ.o: In function `main’:
hesap.c:(.text+0x1f): undefined reference to `tan’
collect2: ld returned 1 exit status

Bu sorunu aşabilmek için “tan” fonksiyonunu barındıran nesne dosyalarının (object files) bulunduğu bir arşiv dosyası olan “libm.a” dosyasını bağlamak(link) gerekir. Bunu gerçekleştirmek için:

$ gcc hesap.c /usr/lib/libm.a -o hesap

komutuyla “/usr/lib/” dizinindeki matematik kütüphanesi olan “libm.a” arşiv dosyasını bağlarız.

Her seferinde uzun şekilde dizini belirtmek yerine:

$ gcc hesap.c -lm -o hesap

şeklinde bir çağırımla da bağlama yapabiliriz. Buradaki -l seçeneği linker için yazıldığını gösterir, “m” ise “libm.a” dosya adındaki “m” harfini gösterir. Büyük programlarda bir çok bağlama seçeneği yazıldığı için bu kısayol işimizi kolaylaştırır.

Kaynaklar ve Yararlı Bağlantılar
http://www.network-theory.co.uk/docs/gccintro/gccintro_17.html
http://joysofprogramming.com/undefined-reference-to-tan/

İyi Çalışmalar…

Pardus Stajı Ardından…

Ha geldi ha geliyor diye bekledik… Güzel bir staj dönemi geldi ve gitti. Aslında staj dönemi içerisinde diğer stajyer arkadaşlar stajın gidişatı ile ilgili çeşitli yazılar yazdılar ve benim de yazmam gerekiyordu fakat açıkçası blog yazmaya bir türlü alışamadım. Hafta içinde Koray Löker‘in genel olarak “yazı yazmak” hakkındaki sözlerinin de verdiği şevkle biraz geç de olsa bir şeyler yazayım dedim.

Staj dönemi genel olarak çok verimli geçti. Staj projesi olarak, USB depolama aygıtlarını biçimlendirmeye yarayan ve KDE4 için Renan Çakırerk tarafından geliştirilen Quick Format uygulamasının KDE3 ortamına port edilmesini seçtim ve geliştirdim. Kaynak kodlarını aşağıdaki bağlantıda[1] bulabilirsiniz. Niyetim, Ubuntu 11.04 üzerinde de test edilen ve çalışan uygulamayı depolara sokabilmek.

Ağustos dönemi stajına gelecek arkadaşlara birkaç tavsiyem olacak:

  • Pardus projesi kapsamında geliştirilen PiSi paket yöneticisi, YALI, COMAR gibi projeler hakkında mümkün mertebe bilgi sahibi olun.
  • DBus (Desktop Bus), UDisks, udev sistemleri hakkında fikir sahibi olun zira benim projemde bunlar hakkında bayaa vakit harcadım. Eğer staja başlamadan bilgi sahibi olursanız ek olarak başka şeyler de öğrenip projeyi daha verimli geliştirirsiniz.
  • Svn kullanımına alışın. Yoksa benim QuickFormat’ın orijinal kodlarına “müdahale” etmem gibi bir durumla karşılaşabilirsiniz. [Aslında ben hata ayıklıyordum :) ]
  • Erken kalkmaya alışın ve tabi serviste uyumaya da.
  • Pardus Gezegen‘deki diğer stajyer arkadaşların yazdıklarına bakıverin.
  • Eğitimler sırasında yanınızda bir not defteri bulundurmak faydalı olabilir.
  • Nihan Katipoğlu Hanımefendi’ye “abla” demeyin :)

Kolay gelsin…

[1] http://svn.pardus.org.tr/uludag/trunk/playground/intern/2011/quickformat-for-KDE3/

Pardus Stajı 2011

Pardus stajı 2011 ile ilgili edindiğim bilgi ve izlenimleri yakında bu sayfada paylaşacağım.

Python’da for-else Yapısı

Python‘a özgü olan for-else yapısı, bazı özel durumlarda kodun okunabilirliğinin artırılması, uzunluğunun ise kısaltılması amacıyla kullanılabilir.

for-else, işleyiş olarak if-else yapısına benzer. for bloğu içerisinde döngünün kırılması (break, fonksiyon içerisindeyse return gibi) durumu gerçekleştiği takdirde else bloğu es geçilir. Tam tersi şekilde for döngüsü herhangi kesmeyle karşılaşmaksızın normal şekilde bitirilirse, else bloğuna girilir.

Örnek olarak bir liste içerisinde 3′e bölünebilen bir sayının olup olmadığını kontrol eden bir fonksiyon yazalım. Eğer 3′e bölünebilen bir sayı varsa ekrana “Listede üçe bölünebilen sayı vardır” yazsın, aksi halde “Listede üçe bölünebilen sayı yoktur” yazsın.

Bu örneği önce for-else yapısı kullanmadan yazalım:

sayilar = [1,133,3,6,77,8,9]

def uce_bolunebilirlik(sayi_listesi):
     """Liste içerisinde 3'e bölünebilen sayının
     varlığını kontrol eden uzun fonksiyon"""

     sayi_var_mi = False

     for sayi in sayi_listesi:
         if sayi % 3 == 0:
             sayi_var_mi = True
             break

     if sayi_var_mi is True:
         print "sayi var"
     else:
         print "sayi yok"

uce_bolunebilirlik(sayilar)

Örnekte, kontrolü ek bir bayrak (flag) değişkenle (sayi_var_mi) sağlamış olduk ve kodun uzunluğu -her ne kadar bu kadar basit bir örnekte anlaşılmasa da- arttı.

Aynı örneği for-else yapısını kullanarak yazalım:

sayilar = [1,133,3,6,77,8,9]

def uce_bolunebilirlik(sayi_listesi):
     """Liste içerisinde 3'e bölünebilen sayının
     varlığını kontrol eden fonksiyon"""

     for sayi in sayi_listesi:
         if sayi % 3 == 0:
             print "Listede üçe bölünebilen sayı vardır"
             break
     else:
         print "Listede üçe bölünebilen sayı yoktur"

uce_bolunebilirlik(sayilar)

Örnekte, sayilar listesi for döngüsüne sokulup, elemanları tek tek kontrol edilir. Üçe bölünebilen bir elemana rastlandığı an döngü break ile kırılır (return ile fonksiyonu bitirme de olabilir). Döngü kırıldığı için else bloğu es geçilir.

Eğer listede herhangi üçe bölünebilen bir sayı olmasaydı o zaman for döngüsü herhangi bir kırılmayla karşılaşmayacak ve normal şekilde bitip else bloğuna geçilecekti.

İyi Çalışmalar…

pyRenk: Python Kod Renklendirici

pyRenk

pyRenk, Python kodlarınızı renklendirmeyi sağlayan (syntax highlighting), PyQt tabanlı Pardus 2011 üzerinde geliştirilmiş bir programdır. Şuanki sürümü 0.02.

pyRenk Özellikleri

  • Açılan .py dosyasındaki Python kodlarını uygun şekillerde renklendirir.
  • HTML etiketleri ile renklendirilmiş olan kodun, web sayfasında nasıl görüneceğinin önizlemesini verir.
  • PyQt tabanlıdır.
  • GPLv3 lisanslıdır.
  • Çoklu platform desteği [ Windows 7 ve Pardus 2011 üzerinde test edildi ]

Proje Sayfası: https://sourceforge.net/projects/pyrenk/

Ekran Görüntüleri: https://sourceforge.net/project/screenshots.php?group_id=515403

Windows 7 üzerinde HTML etiketlerinin yerleştirilmesi

Windows 7 üzerinde HTML etiketlerinin yerleştirilmesi

Pardus 2011 üzerinde renklendirilmiş kodun önizlemesi

Pardus 2011 üzerinde renklendirilmiş kodun önizlemesi

İyi Kullanımlar…