SORU
10 NİSAN 2015, Cuma


Nasıl bu C programı iki temel işlevi ile derleme çalışıyor mu?

Bir özel kütüphanesi ile çalışırken bugün, garip bir davranış buldum. Statik bir kütüphane kodu main() hata ayıklama işlevi içeriyordu. İçinde #define bir bayrak değildi. Kütüphanede mevcut ayrıca. Ve gerçek main() içerdiği başka bir program için bağlantı kullanılır.
İkisi de birbirine bağlı olduğunda, linker main() birden fazla beyanname bir hata atmadı. Bunun nasıl olacağını merak ediyordum.

Basit yapmak için, bir simüle aynı davranışı örnek bir program oluşturduk:

$ cat prog.c
#include <stdio.h>
int main()
{
        printf("Main in prog.c\n");
}

$ cat static.c
#include <stdio.h>
int main()
{
        printf("Main in static.c\n");
}

$ gcc -c static.c
$ ar rcs libstatic.a static.o
$ gcc prog.c -L. -lstatic -o 2main
$ gcc -L. -lstatic -o 1main

$ ./2main
Main in prog.c
$ ./1main
Main in static.c

Nasıl "2main" ikili 7 ** çalıştırmak için bulmak?

Ama ikisi de derleme birlikte birden fazla beyanname bir hata veriyor:

$ gcc prog.c static.o
static.o: In function `main':
static.c:(.text 0x0): multiple definition of `main'
/tmp/ccrFqgkh.o:prog.c:(.text 0x0): first defined here
collect2: ld returned 1 exit status

Herkes bu davranışı açıklayabilecek olan var mı?

CEVAP
10 NİSAN 2015, Cuma


Ld(1) alıntı:

Linker komut satırında belirtilen yere bir arşivi tek bir yerde arayacaktır. Eğer arşiv komut satırında arşiv önce ortaya çıkan bazı nesne tanımlanmamış bir sembol tanımlar, linker uygun dosya(lar) arşiv yer alacak.

2main, ana sembol bağlama ld ulaşır-lstatic önce çözüldüğünde, ld prog seçer çünkü.Ç.

Zaman tanımsız ana var 1main, bağlarken ana için arşiv arar-lstatic, alır.

Bu mantık sadece arşiv (statik kitaplıkları), normal nesneler için geçerlidir. Prog bağlamak.o ve statik.o, her iki nesnenin tüm sembolleri yinelenen tanımı bir hata olsun koşulsuz olarak dahil edilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Garrett Müller

    Garrett Mül

    26 HAZİRAN 2009
  • TheOtherMau5

    TheOtherMau5

    6 Mart 2012
  • TotalxLuna

    TotalxLuna

    27 Kasım 2011