2012-04-27 37 views
48

Tôi đã tìm thấy lệnh sau: strings /usr/lib/libstdc++.so.6 | grep GLIBC từ here. Dường như nó hoạt động nhưng đây là một phương pháp ad-hoc/heuristic.Làm thế nào để bạn tìm thấy phiên bản của thư viện libstdC++ được cài đặt trên máy linux của bạn?

Có một lệnh cụ thể có thể được sử dụng để truy vấn phiên bản thư viện của C++ không? Hoặc là phương pháp tôi tìm thấy phương pháp được chấp nhận?

Trả lời

6

Bạn có thể sử dụng g++ --version kết hợp với the GCC ABI docs để tìm hiểu.

49

Để tìm mà thư viện đang được sử dụng bạn có thể chạy

$ /sbin/ldconfig -p | grep stdc++ 
    libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6 

Danh sách các phiên bản tương thích cho libstdC++ phiên bản 3.4.0 trở lên được cung cấp bởi

$ strings /usr/lib/libstdc++.so.6 | grep LIBCXX 
GLIBCXX_3.4 
GLIBCXX_3.4.1 
GLIBCXX_3.4.2 
... 

Đối với phiên bản trước đó là biểu tượng GLIBCPP được định nghĩa.

Con tem ngày của thư viện được định nghĩa trong một macro __GLIBCXX__ hay __GLIBCPP__ tùy theo phiên bản:

// libdatestamp.cxx 
#include <cstdio> 

int main(int argc, char* argv[]){ 
#ifdef __GLIBCPP__ 
    std::printf("GLIBCPP: %d\n",__GLIBCPP__); 
#endif 
#ifdef __GLIBCXX__ 
    std::printf("GLIBCXX: %d\n",__GLIBCXX__); 
#endif 
    return 0; 
} 

$ g++ libdatestamp.cxx -o libdatestamp 
$ ./libdatestamp 
GLIBCXX: 20101208 

Bảng datestamps của libstdC++ phiên bản được liệt kê trong documentation:

+8

Các datestamps được gần như hoàn toàn vô dụng, tôi không biết tại sao chúng ta bận tâm giữ cho chúng hoặc chủ tài liệu chúng. Ví dụ: ngày cho GCC 4.6.3 muộn hơn 4.7.0, nhưng 4.7.0 có nhiều tính năng hơn, vì vậy việc sử dụng nào là biết ngày được phát hành? –

14

Cơ chế tôi có xu hướng sử dụng là sự kết hợp của readelf -V để kết xuất thông tin .gnu.version từ libstdC++ và sau đó là bảng tra cứu khớp với giá trị lớn nhất GLIBCXX_ được trích xuất.

readelf -sV /usr/lib/libstdc++.so.6 | sed -n 's/.*@@GLIBCXX_//p' | sort -u -V | tail -1 

nếu phiên bản của sort là quá già để có -V tùy chọn (trong đó phân loại theo số phiên bản) sau đó bạn có thể sử dụng:

tr '.' ' ' | sort -nu -t ' ' -k 1 -k 2 -k 3 -k 4 | tr ' ' '.' 

thay vì sort -u -V để sắp xếp theo lên đến 4 số phiên bản.

Nói chung, phù hợp với phiên bản ABI phải đủ tốt.

Nếu bạn đang cố gắng để theo dõi xuống libstdc++.so.<VERSION>, tuy nhiên, bạn có thể sử dụng một chút bash như:

file=/usr/lib/libstdc++.so.6 
while [ -h $file ]; do file=$(ls -l $file | sed -n 's/.*-> //p'); done 
echo ${file#*.so.} 

để cho hệ thống của tôi này mang lại 6.0.10.

Nếu, tuy nhiên, bạn đang cố gắng để có được một nhị phân đã được biên dịch trên systemX để làm việc trên systemY, sau đó các loại điều sẽ chỉ giúp bạn có được cho đến nay. Trong những trường hợp, mang theo một bản sao của libstdC++ để được sử dụng cho các ứng dụng, và sau đó có một kịch bản chạy mà không một:.

export LD_LIBRARY_PATH=<directory of stashed libstdc++.so> 
exec application.bin "[email protected]" 

thường làm việc xung quanh vấn đề của .so đó là trên các hộp không tương thích với phiên bản từ ứng dụng. Đối với những khác biệt cực đoan trong môi trường, tôi có xu hướng chỉ thêm tất cả các thư viện phụ thuộc cho đến khi ứng dụng hoạt động đúng. Đây là tương đương với linux làm việc xung quanh những gì, cho các cửa sổ, sẽ được coi là dll hell.

+0

Bạn có thể sử dụng 'ident' hoặc' what' trên tệp thư viện để tìm thông tin phiên bản được nhúng không? –

+0

'ident' có tương đương với một' chuỗi -a | grep '\ $. * \ $' ',' cái gì' sử dụng tương đương với 'chuỗi -a | fgrep '@ (#)' ', cả hai đều không xác định thông tin phiên bản của thư viện bên dưới nếu các chuỗi đó không được biên dịch. Dựa vào thông tin ABI có ý nghĩa hơn nếu bạn đang cố gắng xác định tính tương thích, vì nó thường luộc vào bản dựng, trong khi ident/chuỗi nào có xu hướng bị bỏ qua – Petesh

10

Chính xác bạn muốn biết điều gì?

Soname thư viện được chia sẻ? Đó là một phần của tên tệp, libstdc++.so.6 hoặc được hiển thị bởi readelf -d /usr/lib64/libstdc++.so.6 | grep soname.

Số sửa đổi nhỏ? Bạn sẽ có thể nhận được rằng bằng cách đơn giản kiểm tra những gì các điểm liên kết tượng trưng đến:

$ ls -l /usr/lib/libstdc++.so.6 
lrwxrwxrwx. 1 root root 19 Mar 23 09:43 /usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.16 

Điều đó nói với bạn nó là 6.0.16, mà là phiên bản thứ 16 của phiên bản libstdc++.so.6, tương ứng với phiên bản GLIBCXX_3.4.16 biểu tượng.

Hoặc bạn có nghĩa là bản phát hành đến từ đó? Đó là một phần của GCC do đó, nó cùng một phiên bản như GCC, vì vậy trừ khi bạn đã hơi say lên hệ thống của bạn bằng cách cài đặt các phiên bản chưa từng có của g++libstdc++.so bạn có thể nhận được rằng từ:

$ g++ -dumpversion 
4.6.3 

Hoặc, trên hầu hết các distro, bạn có thể chỉ cần hỏi người quản lý gói. Trên máy chủ Fedora của tôi đó là

$ rpm -q libstdc++ 
libstdc++-4.6.3-2.fc16.x86_64 
libstdc++-4.6.3-2.fc16.i686 

Như câu trả lời khác đã nói, bạn có thể lập bản đồ phát hành các phiên bản thư viện bằng cách kiểm tra the ABI docs

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