[Çözüldü]GL/glut.h undefined reference to `glutInit'

Başlatan gomugomuno, 04 Mayıs 2011 - 14:11:44

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

gomugomuno

Code::Blocks ile opengl projesi oluşturup glut.h kütüphanesini ekledikten  sonra  undefined reference to `glutInit' hatasini aliyorum.freeglut3 ve kurulmasi gerekn diğer kütüphaneleri kurduğumu düşünüyorum.Ayrica    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); de de aynı hatayi alıyorum.


#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/glx.h>    /* this includes the necessary X headers */
#include <GL/gl.h>

#include <X11/X.h>    /* X11 constant (e.g. TrueColor) */
#include <X11/keysym.h>

static int snglBuf[] = {GLX_RGBA, GLX_DEPTH_SIZE, 16, None};
static int dblBuf[]  = {GLX_RGBA, GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, None};

Display   *dpy;
Window     win;
GLfloat    xAngle = 42.0, yAngle = 82.0, zAngle = 112.0;
GLboolean  doubleBuffer = GL_TRUE;

void fatalError(char *message)
{
  fprintf(stderr, "main: %s\n", message);
  exit(1);
}

void redraw(void)
{
  static GLboolean   displayListInited = GL_FALSE;

  if (displayListInited)
  {
    /* if display list already exists, just execute it */
    glCallList(1);
  }
  else
  {
    /* otherwise compile and execute to create the display list */
    glNewList(1, GL_COMPILE_AND_EXECUTE);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    /* front face */
    glBegin(GL_QUADS);
      glColor3f(0.0, 0.7, 0.1);  /* green */
      glVertex3f(-1.0, 1.0, 1.0);
      glVertex3f(1.0, 1.0, 1.0);
      glVertex3f(1.0, -1.0, 1.0);
      glVertex3f(-1.0, -1.0, 1.0);

      /* back face */
      glColor3f(0.9, 1.0, 0.0);  /* yellow */
      glVertex3f(-1.0, 1.0, -1.0);
      glVertex3f(1.0, 1.0, -1.0);
      glVertex3f(1.0, -1.0, -1.0);
      glVertex3f(-1.0, -1.0, -1.0);

      /* top side face */
      glColor3f(0.2, 0.2, 1.0);  /* blue */
      glVertex3f(-1.0, 1.0, 1.0);
      glVertex3f(1.0, 1.0, 1.0);
      glVertex3f(1.0, 1.0, -1.0);
      glVertex3f(-1.0, 1.0, -1.0);

      /* bottom side face */
      glColor3f(0.7, 0.0, 0.1);  /* red */
      glVertex3f(-1.0, -1.0, 1.0);
      glVertex3f(1.0, -1.0, 1.0);
      glVertex3f(1.0, -1.0, -1.0);
      glVertex3f(-1.0, -1.0, -1.0);
    glEnd();
    glEndList();
    displayListInited = GL_TRUE;
  }
  if (doubleBuffer)
    glXSwapBuffers(dpy, win);/* buffer swap does implicit glFlush */
  else
    glFlush();  /* explicit flush for single buffered case */
}

int main(int argc, char **argv)
{
   glutInit(&argc , argv); // Işte tam oarak burada
  XVisualInfo         *vi;
  Colormap             cmap;
  XSetWindowAttributes swa;
  GLXContext           cx;
  XEvent               event;
  GLboolean            needRedraw = GL_FALSE, recalcModelView = GL_TRUE;
  int                  dummy;

  /*** (1) open a connection to the X server ***/

  dpy = XOpenDisplay(NULL);
  if (dpy == NULL)
    fatalError("could not open display");

  /*** (2) make sure OpenGL's GLX extension supported ***/

  if(!glXQueryExtension(dpy, &dummy, &dummy))
    fatalError("X server has no OpenGL GLX extension");

  /*** (3) find an appropriate visual ***/

  /* find an OpenGL-capable RGB visual with depth buffer */
  vi = glXChooseVisual(dpy, DefaultScreen(dpy), dblBuf);
  if (vi == NULL)
  {
    vi = glXChooseVisual(dpy, DefaultScreen(dpy), snglBuf);
    if (vi == NULL) fatalError("no RGB visual with depth buffer");
    doubleBuffer = GL_FALSE;
  }
  if(vi->class != TrueColor)
    fatalError("TrueColor visual required for this program");

  /*** (4) create an OpenGL rendering context  ***/

  /* create an OpenGL rendering context */
  cx = glXCreateContext(dpy, vi, /* no shared dlists */ None,
                        /* direct rendering if possible */ GL_TRUE);
  if (cx == NULL)
    fatalError("could not create rendering context");

  /*** (5) create an X window with the selected visual ***/

  /* create an X colormap since probably not using default visual */
  cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone);
  swa.colormap = cmap;
  swa.border_pixel = 0;
  swa.event_mask = KeyPressMask    | ExposureMask
                 | ButtonPressMask | StructureNotifyMask;
  win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0,
                      300, 300, 0, vi->depth, InputOutput, vi->visual,
                      CWBorderPixel | CWColormap | CWEventMask, &swa);
  XSetStandardProperties(dpy, win, "main", "main", None,
                         argv, argc, NULL);

  /*** (6) bind the rendering context to the window ***/

  glXMakeCurrent(dpy, win, cx);

  /*** (7) request the X window to be displayed on the screen ***/

  XMapWindow(dpy, win);

  /*** (8) configure the OpenGL context for rendering ***/

  glEnable(GL_DEPTH_TEST); /* enable depth buffering */
  glDepthFunc(GL_LESS);    /* pedantic, GL_LESS is the default */
  glClearDepth(1.0);       /* pedantic, 1.0 is the default */

  /* frame buffer clears should be to black */
  glClearColor(0.0, 0.0, 0.0, 0.0);

  /* set up projection transform */
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10.0);
  /* establish initial viewport */
  /* pedantic, full window size is default viewport */
  glViewport(0, 0, 300, 300);

  printf( "Press left mouse button to rotate around X axis\n" );
  printf( "Press middle mouse button to rotate around Y axis\n" );
  printf( "Press right mouse button to rotate around Z axis\n" );
  printf( "Press ESC to quit the application\n" );

  /*** (9) dispatch X events ***/

  while (1)
  {
    do
    {
      XNextEvent(dpy, &event);
      switch (event.type)
      {
        case KeyPress:
        {
          KeySym     keysym;
          XKeyEvent *kevent;
          char       buffer[1];
          /* It is necessary to convert the keycode to a
           * keysym before checking if it is an escape */
          kevent = (XKeyEvent *) &event;
          if (   (XLookupString((XKeyEvent *)&event,buffer,1,&keysym,NULL) == 1)
              && (keysym == (KeySym)XK_Escape) )
            exit(0);
          break;
        }
        case ButtonPress:
          recalcModelView = GL_TRUE;
          switch (event.xbutton.button)
          {
            case 1: xAngle += 10.0;
              break;
            case 2: yAngle += 10.0;
              break;
            case 3: zAngle += 10.0;
              break;
          }
          break;
        case ConfigureNotify:
          glViewport(0, 0, event.xconfigure.width,
                     event.xconfigure.height);
          /* fall through... */
        case Expose:
          needRedraw = GL_TRUE;
          break;
      }
    } while(XPending(dpy)); /* loop to compress events */

    if (recalcModelView)
    {
      glMatrixMode(GL_MODELVIEW);

      /* reset modelview matrix to the identity matrix */
      glLoadIdentity();

      /* move the camera back three units */
      glTranslatef(0.0, 0.0, -3.0);

      /* rotate by X, Y, and Z angles */
      glRotatef(xAngle, 0.1, 0.0, 0.0);
      glRotatef(yAngle, 0.0, 0.1, 0.0);
      glRotatef(zAngle, 0.0, 0.0, 1.0);

      recalcModelView = GL_FALSE;
      needRedraw = GL_TRUE;
    }
    if (needRedraw)
    {
      redraw();
      needRedraw = GL_FALSE;
    }
  }

  return 0;
}



Erdem

Derlerken

$ gcc -lGL -lGLU -lglu program.c -o program

şeklinde derlemek gerekiyor sanırım.

Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

gomugomuno

#2
.cpp uzantılı dosyaları derlemek için  bildiğim kadarıyla $ gcc -lGL -lGLU -lglu program.cpp -o program kullanilir  Benim problemim ide ye code:blocks a open gl i tanıtmam gerekiyor  ki değişken  tanımlama hataları veriyor ayrica  bu tanıtma işini nasıl yapabilirim ?

travego0403

Kütüphaneleri kurduğunu varsayarak;
Code Block kullanmadım ama genel yöntemini söyleyeyim.
Açtığın projenin ayarlarına gir
Parametre ayarları vardır, oraya -lGL -lGLU -lglut   (-1 değil, küçük Le (l) ) yaz
Programı derle ve çalıştır.

Konsoldan derlemek içinde cpp dosyalarını
g++ kaynak.cpp -o program
gcc kaynak.c -o program   // C dosyaları için

Derleyiciye parametre eklemek için -l anahtarı kullanılır.OpenGL derlemek için
g++ kaynak.cpp -o program -lGL -lGLU -lglut

Kütüphanelerin kurulumuda şurada anlatılıyor.
http://forum.ubuntu-tr.net/subdomains/forum/index.php/topic,26799.0
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

sem

#4
C++ kodu derleyecekseniz gcc yerine g++ kullanınız.

CodeBlocks kullanmadığım için diğer soruya yanıt veremiyorum... Fakat derleyicilerde bu ayar genelde "Build Settins" gibi bir bölümden yapılıyor...

EK: Ben ieltiyi hazırlarken ileti geldiğine dair uyarı almadım maalesef,  o nedenle göndermiş bulundum...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

gomugomuno

@sem0900 neden gcc değil g++ ben hep gcc kullandim :) Terminalden derleniyor ancak codeblocks değişken tanımlamalarını  yapamadım

sem

@gomugomuno;

bir yerde bi yanlışlık var... Onu bulmak lazım =) .cpp uzantılı dosyayı gcc ile derleyememeniz gerekir normalde.

Normal nedir? Normal olarak bahsettiğim; .cpp uzantısı normalde C++ kodlarına verilir. gcc ise C derleyicisidir. Bu nedenle C++ kodlarını tanımayacaktır. Ama .cpp uzantısınının içeriğini C kodu ile doldurursanız pek ala derlenecektir kod. =)

Ama g++ ile C kodlarını derliyorum derseniz; bu zaten olağandır çünkü C++ derleyicileri standart C kodlarını derlemekle yükümlüdür zaten =)

GCC  yani gcc değil  GCC (GNU Compiler Collection)... Bir çok derleyici barındırsa da bunlar komut ismi olarak bu şekilde farklılıklar gösteriyor; gcc -> C derleyicisi, g++ -> C++ derleyicisi, gcj -> Java derleyicisi gibi...

O nedenle gcc değil g++ dedim...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

travego0403

#7
@sem900   Önemli değil forumlarda sık sık rastlanabiliyor bu aynı anda mesaj yazma olaylarına. :)

Az önce CodeBlocks kurup OpenGL derlemeye baktım ve ayarları şöyle yapılıyormuş.(Konsol uygulaması olarak açtım projeyi)
*Projemizi açıyoruz ve kodlarımızı yazıyoruz.
*Project menüsünden Build Options'a  giriyoruz.
*Açılan pencereden Linker Settings sekmesine geçiyoruz.
*Sağdaki kutu(Other Linker Options) içerisine parametreleri yazıyoruz.   -lglut -lGLU -lGL
*Tamam deyip kapatıyoruz, derleyip çalıştırıyoruz.Herşey  tamam :D


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 17 Haziran 2011 - 11:15:12

CodeBlocks la biraz alıştırma yaptımda hoşuma gitmeye başladı, kod renklendirmeleri falan...

Acaba şu kod yazmanın bir ayarı varmı, mesela CodeBlocks otomatik olarak
for(int i=0;i<10;i++)
{
    cout<<"Merhaba Dünya\n";
}

Şeklinde yazıyor ben ise şu şekilde yazmasını istiyorum, NetBeans ta bu stile alıştım hemde fazla satır kaplamıyor.
for(int i=0;i<10;i++){
    cout<<"Merhaba Dünya\n";
}


Acaba bir ayarı varmı bunun.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

gomugomuno

#8
@trevego0403 ide yi açtıktan sonra Setting->Editör  solda en alttaki menü Source Formatter i seç , istediğin java stilini görüceksin secenekler arasında.
Bu arada CodeBlocksu daha çooook seveceksin :)
@sem0900 ben codeblocks ta  c++  ile bolca classların olduğu bir sürü GNU GCC compiler kullanarak  proje yazdım hepside çalişti. :(

travego0403

Dediğin ayarı yaptım ama hala eski stilde yazıyor, acaba bir şeyi eksik mi yapıyorum?
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

gomugomuno

#10
Yazmadan önce söylemem gerekn bir şey vardı "bende değişmiyor" :D
Bu arada teşekkürler @travego0403,@sem0900

sem

@gomugomuno

CodeBlocks'un marifetidir o... Bir şekilde g++'a geçiyordur diye düşünüyorum...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

travego0403

@gomugomuno :D Artık kendi stilimizi kendimiz ayarlıcaz
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

Erdem

Alıntı yapılan: sem0900 - 17 Haziran 2011 - 05:46:28
@gomugomuno;

bir yerde bi yanlışlık var... Onu bulmak lazım =) .cpp uzantılı dosyayı gcc ile derleyememeniz gerekir normalde.

İlk yazılan kod C kodu olduğu için derleyici uzantısı .cxx olan tüm dosyaları derleyebilir. C++ derleyicisi de aynı şekilde. Hatta belki .d uzantılı dosyaları da derleyebiliyordur denemek lazım :)

Alıntı yapılan: travego0403 - 17 Haziran 2011 - 10:49:18
for(int i=0;i<10;i++)
{
    cout<<"Merhaba Dünya\n";
}


Ön ek olan ++ operatörü her zaman daha hızlıdır. O yüzden önek olanı kullanmanı tavsiye ederim.


for (int i = 0; i < 10; ++i) {
std::cout << "Merhaba Dunya\n";
}

Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

sem

Ön ek olanın hızlı olmasının nedenini biliyor musunuz acaba?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem

Bunun nedeni ++i bazen i++'den hızlıdır ama hiç bir zaman i++'den yavaş değildir. Temel türler için hız olarak bir fark olmasa da sınıf türleri ve erişici gibi türler kullanıldığında ++i daha hızlı olabilir. Çünkü i++ nesnenin (kapsam içinde buradaki örnekte for döngüsünün kapama parantezleri içinde) geçici bir kopyasını oluşturur.

[13.15] Which is more efficient: i++ or ++i?

Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

gomugomuno

Ön ekin son ekten tek farkı olduğunu biliyordum o da sanırım alt satıra geçmedenn arttırma işlemini yapması ?( Buda hızla ilgili bir şey değil.Programın işleyişine bağlı kullanılır.

sem

İşime yarar mı emin değilim ama merakımdan zamanım olduğunda okuyacağım yazıyı. Teşekkürler bağlantı için.  Sınıflar için kullanmam çok büyük ihtimal =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem

Temel türler ile ilgili kısımdan zaten bahsetmiştim.

Sınıf türlerine gelince

class Sayi
{
    public:
    Sayi& operator++ ();    // önek ++
    Sayi operator++ (int); // sonek ++
};


Önek olan ++ bir referans döndürür. Son ek olan ise nesnenin kendisini döndürür. Referanslar ise her zaman daha hızlıdır. Sonek olan ++'ın gereksiz bir int aldığına dikkat edin.

Bu işleçlerin gerçekleme kısmını yazarsak:

Sayi & Sayi::operator++ ()
{
    // ...
return *this;
}

Sayi Sayi::operator++ (int)
{
    // ...
Sayi sonuc = *this;
++(*this); //operator++ işlevini çağırıyoruz
return sonuc;
}


İkinci son ek olan this nesnesinin yerel bir kopyasını oluşturabilir. Bu da önek olandan yavaş çalışmasına neden olur.

Son ek olan ++ operatörünü kullanmak C'den C++'ye geçen programcılarda görülen bir alışkanlıktır. Ama C++ kodu yazıyorsak dediğim gibi önek olan ++i bazen ++i'den daha hızlıdır ama hiçbir zaman yavaş değildir. Bu yüzden iyi bir programlama alışkanlığı olarak önek olanı kullanmak tavsiye edilir.


Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

travego0403

Evet dediğiniz gibi ön ek daha hızlı çalışabilir, Operatörlerin aşırı yüklenmesi konusunu incelerken söylediğiniz referans döndürme, nesne kopyası döndürme gibi konuları okumuştum ama hiç döngü değişkeninde ön ek kullanmak aklıma gelmemişti.  :)
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

Erdem

Aslında bahsettiğim gibi örneğin int gibi temel türler için hız olarak farketmez. Ama buradaki değişken örneğin bir erişici olabilirdi.

vector<int> sayilar;
vector<int>::iterator konum;

for(konum = sayilar.begin(); konum != sayilar.end(); ++konum) {
cout << *konum << ' ';
}
cout << endl;

Evet bu şekilde C++ için yararlı öğütleri çoğaltabiliriz  :D Örneğin:


  • Mümkün olduğunca göstergeler yerine referansları tercih edin
  • Makrolar kötüdür. Uzak durun
  • vs.. vs..

Üstte verdiğim Parashift C++ Faq Lite sayfasını bu öğütlerin nedenlerini anlatan güzel bir kaynak.

Bu konuda D'yi aşmış gibi görüyorum  :D Programcının ihtiyacına göre gerekli çözümleri sağlıyor ve hangisini tercih edeceğimizi bize bırakıyor.
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

travego0403

"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

Erdem

Evet biraz reklam olabilir ama bence reklam yaptığım kadar var  8)

Örneğin daha önce C++ ile bir Pacman kodlamıştım. Burada bellek yönetimi için boost::shared_ptr kullanmışım. Ama onun da yetersiz kaldığı durumlar olabiliyor. shared_from_this ya da weak_ptr kullanmak gerekiyormuş.


#include <list>
#include <boost/shared_ptr.hpp>

class OyunNesnesi;
class Oyun;

typedef boost::shared_ptr<OyunNesnesi> OyunNesnesiPtr;
typedef boost::shared_ptr<Oyun> OyunPtr;

class OyunNesnesi
{
public:

OyunNesnesi (Oyun * oyun)
{
oyun_.reset (oyun);
//this->oyun_ = oyun;
}

virtual ~OyunNesnesi() {}

OyunNesnesi (OyunNesnesi const &);
OyunNesnesi & operator= (OyunNesnesi const &);

virtual void zipla() = 0;

protected:

OyunPtr oyun_;

};


struct CL_Sprite
{};


typedef boost::shared_ptr<CL_Sprite> CL_SpritePtr;

class Pacman : public OyunNesnesi
{
CL_SpritePtr duran_;

public:

Pacman(Oyun * oyun)
:
OyunNesnesi (oyun),
duran_(new CL_Sprite())
{}

Pacman(Pacman const & baska)
:
OyunNesnesi(baska), // <--- acikca bizim yapmamiz onemli!
duran_(new CL_Sprite(*baska.duran_))
{}

Pacman & operator= (Pacman const &);

virtual void zipla()
{
// Pacman'in ziplamasi
}
};

typedef boost::shared_ptr<Pacman> PacmanPtr;

class Oyun
{
PacmanPtr pacman_;

public:

Oyun () {}
~Oyun () {}

Oyun (Oyun const &);
Oyun & operator= (Oyun const &);

void basla ();

};

void Oyun::basla ()
{
pacman_ = new Pacman (this);
}


int main()
{
Oyun oyun;
oyun.basla ();
}


Bu örneği vermemin nedeni örneğin D'de bu tür bellek işlemlerini kolay bir şekilde halledebiliyoruz. Şu anda yazdığım projede beni yavaşlatan tek şey tembellik!  :)

D olanakları ile C++ olanaklarını karşılaştırınca arada gerçekten çok fark var.

Demek istediğim örneğin ben 6-7 sene C++ öğrendim sonra D öğrenmeye başladım. Hadi 3 sene diyelim. Bunun içinde okuduğum bir sürü Türkçe ve İngilizce kitap var. Aslında bir dili öğrenmeyi bırakıp başka bir dili öğrenmeye başlamak kolay bir karar değil. Hele bu dil C++ gibi geniş bir topluluğu olan ve en popüler programlama dillerinden biriyse..

Ama bir tarafta C++'nin en saygın isimlerinden, yazdığı kitaplar C++ konusunda ileri düzey kabul edilen Andrei Alexandrescu da D'nin bir kısmını kodluyor. Hatta yazdığı kitapla ilgili Amazon.com'da birisi düşük puan vermiş. (Normalde kitabın ortalaması çok yüksek) Neden düşük puan vermiş diye merak ettim. Yorum şöyleydi: "Andrei bu kitabı zeka ortalaması ilk %0.5'e giren kişiler için yazmış. Ama ortalama bir programcının zekası burada anlatılanları kavrayamaz" Çok komik  :D

Eğer D'nin arkasında milyonlarca dolarlık şirketler olsaydı şimdiye kadar patlamış gitmişti!  :D
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

travego0403

Reklamlar dediğime bakmayın, espri olsun diye yazdım. :)

İnsan bildiği en güzelini diğer kişilerede öğretmek, onlarıda haberdar etmek ister. Sizin ki reklamdan daha çok bilgilendirmeye girer sanırım. :)
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

microanaliz

Eğer D'nin arkasında milyonlarca dolarlık şirketler olsaydı şimdiye kadar patlamış gitmişti!  :D
size katılıyorum bazı diller harbiden firmayla alakalı
MicroAnaliz