2013-05-02 25 views
6

Tôi đang cố gắng biên dịch dự án. Nó biên dịch thành công. My make thoát khỏi lệnh có mã trạng thái là 0 và không có lỗi nào được hiển thị.ldd nói rằng thư viện không được tìm thấy bằng cách biên dịch hoàn tất thành công

Tuy nhiên, dự án không hoạt động và khi tôi chạy ldd -d <file> nó cho thấy tôi có hai thư viện không được tìm thấy.

>ldd -d output_file.so 
    linux-gate.so.1 => (0xf77e0000) 
    libvstdlib_srv.so => not found 
    libtier0_srv.so => not found 
    libm.so.6 => /lib/libm.so.6 (0xf7760000) 
    libdl.so.2 => /lib/libdl.so.2 (0xf775b000) 
    libc.so.6 => /lib/libc.so.6 (0xf75a9000) 
    /lib/ld-linux.so.2 (0x46e4a000) 
undefined symbol: pfVectorNormalize  (output_file.so) 
undefined symbol: _Z12VectorAnglesRK6VectorR6QAngle  (output_file.so) 
undefined symbol: pfSqrt  (output_file.so) 
undefined symbol: __cxa_guard_acquire (output_file.so) 
undefined symbol: __cxa_guard_release (output_file.so) 
undefined symbol: _Z6ConMsgPKcz (output_file.so) 
undefined symbol: Warning  (output_file.so) 
undefined symbol: __dynamic_cast  (output_file.so) 
undefined symbol: _Z11ConColorMsgRK5ColorPKcz (output_file.so) 
undefined symbol: Error (output_file.so) 
undefined symbol: AssertValidStringPtr (output_file.so) 
undefined symbol: _AssertValidWritePtr (output_file.so) 
undefined symbol: _AssertValidReadPtr (output_file.so) 
undefined symbol: _ZTVN10__cxxabiv121__vmi_class_type_infoE  (output_file.so) 
undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE  (output_file.so) 
undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE (output_file.so) 
undefined symbol: __gxx_personality_v0 (output_file.so) 

Hai thư viện được thiết lập liên kết như biểu tượng đến vị trí thực tế của file:

... 
lrwxrwxrwx 1 Andy Andy 62 May 2 12:30 libtier0_srv.so -> /home/dev/sdks/hl2sdk-ob-valve/lib/linux/libtier0_srv.so 
lrwxrwxrwx 1 Andy Andy 64 May 2 12:30 libvstdlib_srv.so -> /home/dev/sdks/hl2sdk-ob-valve/lib/linux/libvstdlib_srv.so 
-rw-r--r-- 1 Andy Andy 5444 May 2 11:53 Makefile 
... 

Các gcc lệnh được chạy là

gcc -I/home/dev/sdks/hl2sdk-ob-valve/public/game/server -I. -I.. -ICEntity -Isdk -I/home/dev/project1/hl2sdk-ob-valve/public -I/home/dev/sdks/hl2sdk-ob-valve/public/engine -I/home/dev/sdks/hl2sdk-ob-valve/public/tier0 -I/home/dev/sdks/hl2sdk-ob-valve/public/tier1 -I/home/dev/sdks/hl2sdk-ob-valve/public/mathlib -I/home/dev/project1/mmsource-central/core -I/home/dev/project1/mmsource-central/core/sourcehook -I/home/dev/project1/sourcemod-central/public -I/home/dev/project1/sourcemod-central/public/sourcepawn -I/home/dev/project1/sourcemod-central/core project1_output/sdk/smsdk_ext.o project1_output/extension.o project1_output/CTrackingProjectile.o project1_output/CSentryRocket.o project1_output/CProjectileRocket.o project1_output/CProjectileArrow.o project1_output/CProjectileFlare.o project1_output/CProjectilePipe.o project1_output/CProjectileSyringe.o project1_output/CEntity/CEntity.o project1_output/CEntity/CEntityManager.o project1_output/CEntity/CPlayer.o /home/dev/project1/hl2sdk-ob-valve/lib/linux/tier1_i486.a libvstdlib_srv.so libtier0_srv.so -m32 -lm -ldl -static-libgcc -shared -o project1_output/output_file.so

Câu hỏi của tôi là: 1.) Tại sao hai thư viện đó không được tìm thấy mặc dù chúng được liên kết với nhau? 2.) Các ký hiệu không xác định là một phần của gói mathlib, được bao gồm trong lệnh gcc. -I/home/dev/sdks/hl2sdk-ob-valve/public/mathlib Tại sao những điều này sẽ không được xác định, mặc dù được đưa vào?

c++ không phải là ngôn ngữ được lựa chọn và tôi biết đủ về Makefiles là nguy hiểm, nhưng không thực sự khắc phục bất cứ điều gì, vì vậy tôi xin lỗi nếu điều này không đủ thông tin. Tôi có thể cung cấp thêm khi cần thiết.

+1

Một lưu ý phụ là SDK _really_ được đặt trong '/ dev'? –

+0

@JoachimIsaksson No! Tôi đã che khuất những con đường và thậm chí không nghĩ về '/ dev'. Tôi đã cập nhật câu hỏi để sử dụng '/ home/dev' để điều này không gây nhầm lẫn cho bất kỳ ai. – Andy

Trả lời

5

Tệp thư viện là các đối tượng dùng chung, có nghĩa là chúng sẽ không được giải quyết cho đến khi thời gian chạy. Để ldd tìm chúng (giả sử Linux hoặc biến thể Unix khác), bạn sẽ cần thêm đường dẫn thư viện vào LD_LIBRARY_PATH của bạn (có một đường dẫn env khác có thể được sử dụng nhưng tôi không thể nghĩ về nó ngay bây giờ) và sau đó ldd sẽ có thể tìm thấy thư viện.

2

Như diverscuba23 đã đề cập, bạn cần thêm đường dẫn thư viện của bạn được đặt tại LD_LIBRARY_PATH của bạn. Một cách thường xuyên dễ dàng, và không làm điều này được quy định cụ thể khi bạn chạy các chương trình như vậy:

LD_LIBRARY_PATH =.:$LD_LIBRARY_PATH ./yourProgram 

Trong trường hợp này thư viện sẽ cần phải nằm trong cùng thư mục bạn đang chạy chương trình.

11

Tôi chỉ tình cờ gặp vấn đề này, có cùng một vấn đề nhưng giải pháp khác.

Sử dụng LD_LIBRARY_PATH sẽ thực tế hoạt động. Và nó là tốt nếu nó là để thử nghiệm của riêng bạn trong môi trường xây dựng của bạn, nhưng bạn nên cố gắng tránh nó bên cạnh một trường hợp như thế này. Đây là một bài viết của một người biết nhiều hơn tôi về điều đó, tại sao LD_LIBRARY_PATH là xấu:

http://xahlee.info/UnixResource_dir/_/ldpath.html

gì đã xảy ra là, như có thể thấy cũng từ thực tế là thiết lập LD_LIBRARY_PATH làm việc, đó là trong thời gian chạy , chương trình của bạn không thể tìm thấy thư viện được chia sẻ libtier0_srv.so. Thay vì thiết lập toàn cục một biến cho tất cả các chương trình để xem xét /home/dev/sdks/hl2sdk-ob-valve/lib/linux/ trước, bạn nên thêm thư mục vào đường dẫn tìm kiếm thư viện thời gian chạy. Bạn làm điều này bằng cách thông qua các tùy chọn

-rpath /home/dev/sdks/hl2sdk-ob-valve/lib/linux/

để ld, các mối liên kết.Bạn có thể làm điều này với lệnh của bạn gcc bạn đăng, bằng cách thêm tùy chọn

-Wl,-rpath,/home/dev/sdks/hl2sdk-ob-valve/lib/linux/,

mà nói gcc để vượt qua các tùy chọn ở trên để ld.

+0

Vâng, điều này tốt hơn phương pháp 'sledgehammer' của việc thiết lập một biến môi trường. – drlolly

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