ข้อผิดพลาด Linker (ln): ไม่พบไฟล์บางไฟล์


1

ฉันกำลังสร้างอะไรบางอย่างจากแหล่งที่มาและฉันจะได้รับผลลัพธ์ต่อไปนี้ในขณะที่ทำ:

  ...
  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

ฉันไปเล็กน้อยและดูเหมือนว่า linker ไม่สามารถค้นหาไฟล์บางไฟล์ได้ ฉันไม่เคยต้องจัดการกับเรื่องนี้ดังนั้นฉันจึงสงสัยว่ามีใครสามารถช่วยฉันถอดรหัสข้อความนี้และทำให้เข้าใจถึงไฟล์ที่ไม่สามารถหาได้และฉันจะบอก linker ว่ามันอยู่ที่ไหน

ฉันรู้ว่าการอ้างอิงมาจาก libpromises.soซึ่งเป็นไฟล์ไบนารี ดังนั้นการเปิดมันใน vi เพียงทำให้ฉัน garble ฉันควรจะมองหา libpromises.h? libpromises.c?


1
คุณแน่ใจหรือว่ามีห้องสมุดที่ต้องการติดตั้งอยู่ อาจเป็นข้อผิดพลาดของข้อกำหนดที่ไม่ได้ผล
new123456

ฉันไม่มีความเชี่ยวชาญในการเขียนโปรแกรม C ดังนั้นฉันจึงไม่แน่ใจว่าไลบรารีเหล่านั้นคืออะไรและจะค้นหาได้อย่างไร สมมติว่าฉันมีพวกเขาฉันจะบอก linker ที่จะมองได้อย่างไร
n0pe

คำตอบ:


2

คุณควรจะสามารถแก้ไข Makefile และทำให้สำเร็จได้อย่างรวดเร็ว

หมายเหตุ - กรณีนี้ถือว่า Makefile ถูกสร้างขึ้นโดย GNU Autotools ตาม Tarball Cfengine พวกเขาทำ

ก่อนอื่นให้เปิด Makefile และค้นหาการตั้งค่าสถานะ LDFLAGS. ควรมีลักษณะเช่นนี้:

LDFLAGS = -lfoo -lbar

ผนวกเข้ากับรายชื่อนั้น -ldl. สิ่งนี้เพิ่มการอ้างอิงไปยังไลบรารีการโหลดแบบไดนามิก

คอมไพล์ใหม่และลิงเกอร์ควรจะสามารถทำงานได้


ตัวแปรสภาพแวดล้อม LIBS เป็นตัวแปรสภาพแวดล้อมที่บอก ./configure จำเป็นต้องใช้ไลบรารีพิเศษใดบ้างจากนั้นจะติดเข้าไปใน Makefile (เพื่อตอบคำถามของคุณ ./configure ไม่ได้เรียกใช้ตัวเชื่อมโยง - มันทำให้ Makefile ซึ่งทำงาน gcc ด้วยพารามิเตอร์ที่ได้รับจาก ./configure )

ดังนั้นใช้ LIBS=-ldl && ./configure.


ดูเหมือนว่าจะเป็นคำตอบที่สนุกฉันจะแก้ไข Makefile :) อย่างไรก็ตามฉันต้องรอจนถึงวันจันทร์เพื่อกลับไปทำงาน ฉันจะโพสต์เมื่อฉันกลับไปทำงานและลองสิ่งนี้
n0pe

ฉันแค่ลองและไม่ได้ผล
n0pe

1
@MaxMackie ลองนี้: export LIBS=-ldl && ./configure. ฉีกจาก ที่นี่ .
new123456

ว้าวฉันคิดว่ามันใช้ได้ ยอดเยี่ยม! คุณสามารถแก้ไขคำตอบและอธิบายว่าตัวแปร LIBS ทำอะไรได้บ้าง และสิ่งที่ธงนั้นบอกคอมไพเลอร์ / ลิงเกอร์? ขอบคุณมาก.
n0pe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.