Başlığa gel. Böyle posta böyle başlık. Mahsun kırmızıgül filmi tadında oldu. Büssürü konuya el atıp hiç birini çözemeden okuyucuyu ortada bırakicim.

Cmake cross platform bir build aracı. Onun sayesinde istediğiniz compiler a göre çıktı ürettirebiliyorsunuz. Nevet nerdeyse bütün derleyicileri destekliyor. Gayet de güncel VS 2010 desteği de var uzunca bir süredir.

Cmake kullanımı için örnek bir kütüphane kullanımı da anlatıcam. Bu kütüphanemiz taglib adlı mp3 taglerini okumaya yarayan bir api. Bu aralar mp3 arşivimi düzenlerkene niye bunları elimle yapıyorum derken buldum kendimi. Taglib amarok, jaangle gibi programların arkasındaki tag engine imiş. Alanında en hızlıymış. Neyse. Ayrıntısı sora.

Öncelikle herkesin bildiği bikaç gereksiz bilgi: lib dosyaları kütüphane(library) dosyaları olup exe oluşturulurken derleme anında statik olarak bağlanırlar. dll dosyaları ise adından da anlaşıldığı üzre dynamic link library olup runtime esnasında doğrudan dinamik olarak kullanılırlar. Ha noldu bu durumda exe’ye tıklandığında dan diye uyarı çıkıp şu dll missing diyosa bu dinamik bir bağlanmadır. lib eksikse zaten compile time’da error gelir.

  1. Taglib indirilir

http://developer.kde.org/~wheeler/taglib.html

  1. Taglib'in çeşitli dependencyleri yok değil. Zlib'in bilgisayarınızda kurulu olması lazım. Onun için de:

http://sourceforge.net/projects/gnuwin32/files/zlib/1.2.3/zlib-1.2.3.exe/download

  1. Cmake indirilip kurulur

http://www.cmake.org/cmake/resources/software.html

  1. Cmake açılır. Taglib içindeki CMakeLists.txt cmake üzerine bırakılır.

Cmake’ten configure butonuna basılır

  1. Çıkan pencereden kendinize uygun compiler seçilir. Bende Visual Studio 2010 kuruluydu o anda. Ordan devam edicim. Vs 2008 Sp1 kuruluysa Visual Studio 9'u seçmelisiniz. Neyse Finiş diyoruz. Bu esnada Visual sütüdyonun kapalı olduğundan emin olun. Cmake kızarır generate etmez yoksa.
  1. Cmake'in orta kısımdaki listesinde birtakım parametrelerin olduğunu görürsünüz. Burası bizim generation işleminin parametreleri aslında. Cmake'in en güzel yanı burda. Parametrelere göre istediğinz ortama göre kod üretiyor. Ben şöyle ayarladım:

  1. ENABLE_STATIC yapamadım ben. Dll çıkarmıyor onu işaretleyince. Ama kodlar da derlenmiyor. 3 saatime mâloldu sağolsun. CPPunit ne ola ki diyenleri duyar gibiyim. O da bilmem bilir misinz birim test yapmak için bir modül. Junit'e benziyor bizim. Olmasa da olur. Hata verirse sallayın.
  1. Ayarlarımızı yaptıktan sora "Generate" diyoruz. Ve tadaa VS solution dosyaları oluşacak.
  1. Cmake'e bayılmamak elde değil. "taglib.sln"i açıyoruz. Build-> Build Solution diyoruz.
  2. Taglib klasörümüzün altındaki Debug klasörüne bir adet .lib ve bir adet .dll uzantılı dosya oluşturulmuş olması lazım. Oluşmadıysa kötü.

..\taglib-1.7\taglib-1.7\taglib\Debug

  1. Şimdi bunları kullanarak bi proje oluşturacağız. Burada Visual Studio'da lib ve dll dosyaları nasıl kullanılır görmüş olunur.
    1. Yeni vs c++ projesi oluşturulur.
    1. Cpp açılıp şu örnek kodu yazabilirsiniz(taglib examplelarından çarptım kodu. Azcık modifiye ettim. Exe'nin yanında f.mp3 olmalı çalışması için. Tabi ki f.mp3'ün tagleri falan düzgün olursa çalışma daa iyi gözlenir):

#include "fileref.h"
#include "tag.h"
#include "iostream"
using namespace std;
int main(int argc, char *argv[])

{

char str[50] = "f.mp3";

TagLib::FileRef f(str);

if(!f.isNull() && f.tag()) {

TagLib::Tag *tag = f.tag();

cout << "-- TAG --" << endl;

cout << "title   - \"" << tag->title()   << "\"" << endl;

cout << "artist  - \"" << tag->artist()  << "\"" << endl;

cout << "album   - \"" << tag->album()   << "\"" << endl;

cout << "year    - \"" << tag->year()    << "\"" << endl;

cout << "comment - \"" << tag->comment() << "\"" << endl;

cout << "track   - \"" << tag->track()   << "\"" << endl;

cout << "genre   - \"" << tag->genre()   << "\"" << endl;

}

if(!f.isNull() && f.audioProperties()) {

TagLib::AudioProperties *properties = f.audioProperties();

int seconds = properties->length() % 60;

int minutes = (properties->length() - seconds) / 60;

cout << "-- AUDIO --" << endl;

cout << "bitrate     - " << properties->bitrate() << endl;

cout << "sample rate - " << properties->sampleRate() << endl;

cout << "channels    - " << properties->channels() << endl;

}

getchar();

return 0;

}

</code>

  1. Şimdi projenin bağımlılıklarını ayarlamaya sıra geldi. Projeye sağ tık -> Properties -> C/C++ -> General:
  1. Additional Include Directories'e headerların klasörlerini eklemeli
  1. Projeye sağ tık -> Properties -> Linker -> Input:

Eklenecekler şunlar:

C:\fw\taglib-1.7\taglib-1.7\taglib\Debug\tagd.lib

d:\Program Files\GnuWin32\lib\zlib.lib

  1. Kodu build edince çalışması lazım. Ve hatta çıktısı da şöyle:

Not: Exe çalışmayabilir ilk etapta. “tagd.dll” dosyasını bulamadım hatası verebilir. Tagd.lib’in olduğu yerde üretilen tagd.dll dosyasını kopyalayıp exe’nin yanına koyarsanız hata giderilir. Diğer yöntem ortam değişkenlerine tagd.lib ve tagd.dll’in olduğu klasörü eklemektir ki ben böyle bi kütüphane için pek gerekli görmüyorum o hareketi. Hani bi Qt kütüphanesi olur eklenir de taglib’e gerek yok.