linuxta derleme/link aşamasında alınan hata?

Başlatan mir_as82, 17 Mayıs 2016, 15:59:22

mir_as82

Makefile dosyası ile derlerken, alınan hata ile ilgili kısım aşağıdaki gibi:
....
...
gcc -o miras_b2 -Wl,-rpath,./lib -pipe -Wall -Wmissing-declarations -D_REENTRANT -D_GNU_SOURCE -DPIC -fpic -I./include miras_b2.o -lpthread -ldl -L./lib -lmiras
./lib/libmiras.so: undefined reference to `dlopen'
./lib/libmiras.so: undefined reference to `dlclose'
./lib/libmiras.so: undefined reference to `dlerror'
collect2: ld returned 1 exit status
make: *** [all] Error 1

Burada hata verip çıkıyor. Bunun nedeni ne olabilir. Aşağıda sırasıyla /lib ve /usr/lib altında olan libdl ile ilgili libraryler verilmiştir.

miras@miras:/lib$ ls -alt | grep libdl
lrwxrwxrwx  1 root root     15 May 17 12:34 libdl.so.2 -> libdl-2.11.1.so
-rw-r--r--  1 root root     9736 May 17 12:33 libdl-2.11.1.so

miras@miras:/usr/lib$ ls -alt | grep libdl
lrwxrwxrwx   1 root     root           15 May 17 12:30 libdl.so -> /lib/libdl.so.2
-rw-r--r--   1 root     root           8094 May 17 12:28 libdl.a





Tagli

#1
Komut satırında -L/lib yerine -L./lib yazmışsın (/ önünde nokta var). Aynı durum -I argümanında da var (bu belki sorun olmayabilir). Sorun bundan kaynaklanıyor olabilir. Ayrıca bazen komut satırı opsiyonlarının veriliş sırası da linker hatalarına sebep olabiliyor.

Düzeltme: Pardon, sanırım . kasıtlı olarak konmuş. O zaman opsiyon sıralamasına odaklanmak lazım. Mantığını hiçbir zaman tam olarak anlayamadım ama bu -l ile başlayan opsiyonları sona koymak şart oluyor bazen.
Gökçe Tağlıoğlu

mir_as82

Yani -lpthread -ldl -L./lib -lmiras   sıralamasını şu şekilde falan mı yapmam gerekir?veya başka türlü? -L./lib -lmiras -lpthread -ldl

Tagli

Evet, bahsettiğim oydu ama işe yaramadıysa ne yapılabilir bilmiyorum. Maalesef dinamik kütüphanelerle pek deneyimim yok. Kullanırsam genelde statik kütüphane kullanıyorum. Belki statik kütüphane ile derlemeyi deneyebilirsin. Bu şekilde sorun çıkarma ihtimalini azaltabileceğini sanıyorum. Eğer statik kütüphane ile her şey yolunda giderse sonra dinamiğe geçmeyi deneyebilirsin. Bu arada, dinamiğin de iki türlüsü var. Program başlarken bağlananlar, veya program çalışırken kod kontrolünde bağlananlar. Sen sanırım ikincisini yapmaya çalışıyorsun. Birinci yöntem daha kolay ve sade olacaktır sanırım.
Gökçe Tağlıoğlu

yamak

#4
Hocam libmiras nasıl derlediniz?