Sen bunu istemiyorsun ama C ile oluşturulmuş program parçası ile D programı oluşturmayı göstereceğim. Şöyle bir C dosyası olsun:
int C_islevi(int i)
{
return i * 7;
}
Onu bağlamadan yalnızca derleyelim:
$ gcc -c deneme.c -o deneme_c.o
Şöyle de bir D dosyası olsun:
extern(C) int C_islevi(int i);
void D_islevi()
{
assert(C_islevi(6) == 42);
}
void main()
{
D_islevi();
}
İkisini kullanarak ve bağlayarak bir program şöyle oluşturulabilir:
dmd deneme_c.o deneme.d -ofdeneme
Şimdi tersini deneyeceğim: Programı gcc ile oluşturacağım ve hatta C'den D'yi çağırmaya çalışacağım. Önce D dosyasından main'i kaldırıyorum ve C tarafından çağrılacak olan işlevini extern(C) olarak bildiriyorum. Bu işlev de tekrar C'ye dönüp az önce yazdığımız C_islevi'ni çağıracak:
extern(C) int C_islevi(int i);
extern(C) void D_islevi()
{
assert(C_islevi(6) == 42);
}
Onu dmd ile bağlamadan yalnızca derliyorum:
$ dmd deneme.d -c -ofdeneme_d.o
Şimdi bir tane de C main dosyası yazalım. Bu dosya hem D tarafındaki işlevi bildirecek hem de onu çağıracak:
// main.c
void D_islevi(); // Bildirim
int main()
{
D_islevi();
}
Şimdi az önce oluşturduğumuz deneme_c.o ve deneme_d.o'yu da kullanarak bu main.c ile bir program oluşturmaya çalışıyorum:
$ gcc deneme_c.o deneme_d.o main.c -odeneme
Demek ki eksik tanımlar var:
'deneme_d.o: In function _D6deneme8__assertFiZv': deneme.d:(.text._D6deneme8__assertFiZv+0x16): undefined reference to
_d_assertm'
deneme_d.o:(.text.d_dso_init[.data.d_dso_rec]+0x32): undefined reference to _d_dso_registry' /tmp/ccX1mdfa.o: In function
main':
main.c:(.text+0xa): undefined reference to `D_islevi'
collect2: ld returned 1 exit status
'
Hmmm. Olmadı. libphobos'u eklemeyi deniyorum ama libcurl-gnutls.so.4 eksik görünüyor:
$ gcc deneme_c.o deneme_d.o main.c -lphobos2 -odeneme
/usr/bin/ld: warning: libcurl-gnutls.so.4, needed by /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/libphobos2.so, not found (try using -rpath or -rpath-link)
..
libcurl-gnutls.so.4'in neden gerektiğini anlamıyorum ve şimdilik bu işi bırakıyorum. :-/
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]