Bağlayıcı (ln) hatası: belirli dosyaları bulamıyor


1

Kaynaktan bir şey yapıyorum ve make çalıştırırken aşağıdaki çıktıyı alıyorum:

  ...
  CC     libpromises_la-mod_outputs.lo
  CC     libpromises_la-unix.lo
  CCLD   libpromises.la
  CC     cfknow.o
  CC     manual.o
  CCLD   cf-know
./.libs/libpromises.so: undefined reference to `dlerror'
./.libs/libpromises.so: undefined reference to `dladdr'
./.libs/libpromises.so: undefined reference to `dlclose'
./.libs/libpromises.so: undefined reference to `dlopen'
./.libs/libpromises.so: undefined reference to `dlsym'
collect2: ld returned 1 exit status
gmake[2]: *** [cf-know] Error 1
gmake[2]: Leaving directory `/tmp/cfengine/cfengine-3.1.5/src'
gmake[1]: *** [all] Error 2
gmake[1]: Leaving directory `/tmp/cfengine/cfengine-3.1.5/src'
gmake: *** [all-recursive] Error 1

Ben biraz googled ve bağlayıcı belirli dosyaları bulamıyor görünüyor. Hiç böyle bir şeyle uğraşmak zorunda kalmamıştım, bu yüzden birisinin bu mesajı çözmeme yardım edip edemediğini ve WHICH dosyasında bulunamayacağını ve bağlayıcıyı nerede olduğunu nasıl anlayabileceğimi merak edip etmediğimi merak ediyorum.

Referansın geldiğini biliyorum libpromises.so, bu ikili bir dosyadır. Bu nedenle, vi'yi açmak, yalnızca beni mırıldanıyor. Aramam mı gerekiyordu? libpromises.h? libpromises.c?


1
Gerekli kütüphanelerin kurulu olduğundan emin misiniz? Karşılanmayan gereksinimlerin bir hatası olabilir.
new123456

C programlama konusunda bilgili değilim, bu yüzden bu kütüphanelerin ne olduğundan ve onları nasıl arayacağından emin değilim. Onlara sahip olduğumu düşünerek, linkere nereye bakacağımı nasıl söyleyebilirim?
n0pe

Yanıtlar:


2

Makefile dosyasını düzenleyebilmeli ve bunu hızlıca yapabilmelisiniz.

NOT - Bu, Makefile dosyasının GNU Autotools tarafından yapıldığını varsayar. Cfengine tarball göre, onlar yapar.

İlk önce Makefile’ı açın ve bayrağa bakın. LDFLAGS. Bunun gibi bir şeye benzemeli:

LDFLAGS = -lfoo -lbar

Bu listeye ekle -ldl. Bu, Dinamik Yükleme kitaplığına bir referans ekler.

Yeniden derleyin ve bağlayıcı işini yapabilmelidir.


LIBS ortam değişkeni, söyleyen bir ortam değişkenidir. ./configure Hangi ilave kütüphanelere ihtiyaç duyulur, bu daha sonra Makefile'e yapışır (sorunuzu cevaplamak için ./configure aslında bağlayıcıyı çalıştırmaz - çalışan Makefile yapar gcc aldığı parametrelerle ./configure ).

Öyleyse kullan LIBS=-ldl && ./configure.


Bu eğlenceli bir cevap gibi gözüküyor, bir Makefile düzenleyeceğim :) Ancak, işe geri dönmek için Pazartesi gününe kadar beklemek zorunda kalacağım. İşe dönüp bunu denediğimde göndereceğim.
n0pe

Sadece bunu denedim ve işe yaramadı.
n0pe

1
@MaxMackie Bunu dene: export LIBS=-ldl && ./configure. -Den sökülmüş İşte .
new123456

Vay, bence işe yaradı. Parlak! Cevabınızı düzenleyebilir ve LIBS değişkeninin ne yaptığını açıklayabilir misiniz? Ve tam olarak bu bayrak derleyiciye / bağlayıcıya ne söylüyor? Çok teşekkürler.
n0pe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.