2012-03-03 43 views
9

Tôi có hai phiên bản GCC được cài đặt trên hệ thống 4.6.2 và 4.7.0 của tôi. Tôi đang chạy Fedora Core 16.GCC Không liên kết các thư viện chính xác

4.6.2 được cài đặt trong /usr/bin và 4.7.0 được cài đặt trong /home/nerozehl/local/bin. Các thư viện và thời gian chạy cho C++ cũng được biên dịch và cài đặt trong /home/nerozehl/local/lib/home/nerozehl/local/lib64.

Tôi cũng có hai phiên bản Boost được cài đặt, với thư viện ở /usr/lib64/home/nerozehl/local/lib. (Tăng 1.47.0 và 1.49.0, tương ứng)

Vấn đề tôi gặp phải là g ++/ld đang liên kết với các thư viện mặc định chứ không phải các thư mới hơn trong /home/nerozehl/local. Tôi đang sử dụng configure để tạo Makefiles, và đang kêu gọi nó theo cách này:

CXX=g++47 CXXFLAGS="-g -O0 -pg" LDFLAGS="-L/home/nerozehl/local/lib" ./configure --prefix=/home/nerozehl/local 

đâu g++47 nằm trong /home/nerozehl/local/bin (trong $PATH của tôi).

Khi tôi biên dịch, mọi thứ đều tốt, và các tiêu đề mới được sử dụng, nhưng khi tôi kiểm tra những gì nó được liên kết chống lại:

ldd source/noes 
    linux-vdso.so.1 => (0x00007fffebfff000) 
    libboost_filesystem-mt.so.1.47.0 => /usr/lib64/libboost_filesystem-mt.so.1.47.0 (0x0000003c6a800000) 
    libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x0000003c6a400000) 
    libboost_program_options-mt.so.1.47.0 => /usr/lib64/libboost_program_options-mt.so.1.47.0 (0x0000003c6ac00000) 
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003c6dc00000) 
    libm.so.6 => /lib64/libm.so.6 (0x0000003c68c00000) 
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003c69c00000) 
    libc.so.6 => /lib64/libc.so.6 (0x0000003c68800000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c69000000) 
    librt.so.1 => /lib64/librt.so.1 (0x0000003c69800000) 
    /lib64/ld-linux-x86-64.so.2 (0x0000003c68400000) 

Đối với cuộc sống của tôi, tôi không thể tìm ra cách để buộc g ++/ld/configure để sử dụng các thư viện mới hơn của tôi. Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

+1 để sử dụng ldd – pyCthon

+0

Bạn nên kiểm tra tùy chọn '-v' cách đường dẫn tìm kiếm thư viện hiện tại trông như thế nào: khi liên kết g ++ sẽ hiển thị thư mục nào sẽ tìm kiếm và theo thứ tự nào. Để tránh sự cố, hãy thử chuyển đường dẫn mong muốn bằng tùy chọn '-L'. Tôi đoán là nó tìm kiếm các đường dẫn chuẩn trước đường dẫn cục bộ trong các thư mục bổ sung. –

+0

Tôi đang sử dụng -L/home/nerozehl/local/lib – nerozehl

Trả lời

9

ldd không cho bạn biết những gì thực thi được liên kết chống lại - nó cho bạn biết những gì các đối tượng chia sẻ tệp thực thi sẽ tải khi chạy. Nếu bạn muốn nó tải từ/home/nerozehl khi nó chạy, bạn cần phải làm một trong những điều sau:

  • thiết LD_LIBRARY_PATH để chứa/home/nerozehl/local/lib khi bạn chạy chương trình

  • thêm/home/nerozehl/local/lib vào ld.so.conf để nó sẽ được mọi người sử dụng. Chỉ hoạt động trên các hệ thống (chẳng hạn như linux) sử dụng ld.so.conf, tuy nhiên.

  • liên kết chương trình với -Wl,-rpath,/home/nerozehl/local/lib. Chỉ hoạt động trên các hệ thống sử dụng ELF hoặc một định dạng thực thi khác có hỗ trợ nó. Nó cũng hardcodes đường dẫn vào thực thi, đó là hơi mong manh - nếu bạn di chuyển thực thi đến một máy khác hoặc sắp xếp lại hệ thống tập tin của bạn nó có thể phá vỡ.

+0

Chương trình nào sẽ cho tôi biết thư viện nào được liên kết với các thư viện nào? – nerozehl

+0

@nerozehl - không có cách nào để nói sau khi liên kết hoàn tất, vì thông tin đó không được lưu trữ trong tệp nhị phân. –

1

Bạn có chắc chắn tập lệnh cấu hình của mình đang chú ý đến LDFLAGS không? Chạy ./configure --help và xem các tùy chọn. Thường có một cái gọi là --with-boost = và sau đó bạn cung cấp thư mục chứa vị trí tăng. Hãy thử cái đó thay thế. Tương tự như vậy đối với bất kỳ tùy chọn nào khác mà bạn gặp sự cố.

Các vấn đề liên quan