cuốn sách gpt4 ai đã làm

c++ - Lỗi khủng khiếp với strtod(): glibc-2.13 không tương thích ngược với glibc-2.9?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 02:10:23 27 4
mua khóa gpt4 Nike

Tôi đang làm việc trên một chương trình C và C++ cần chạy trên một số nền tảng nhúng khác nhau và để làm được điều này, tôi có một trình biên dịch chéo để tôi có thể xây dựng nó trên máy tính để bàn x86 của mình.

Tôi đang gặp sự cố nghiêm trọng với một số hàm, chẳng hạn như "strtod()". Đây là chương trình thử nghiệm đơn giản của tôi:

#include 
#include

int main(int argc, char **argv)
{
if ( (argc < 2) || (NULL == argv[1]) ) trả về 0;
nhân đôi myDouble = strtod(argv[1], NULL);
printf("\nValue: %f\n\n", myDouble);
return 0;
}

Thông thường tôi xây dựng tất cả các chương trình bằng cách sử dụng liên kết động để giữ cho các tệp nhị phân càng nhỏ càng tốt. Phần trên hoạt động tốt trên x86 và Power PC. Tuy nhiên, trên hệ thống Arm (BeagleBoard xM với Debian), strtod() hoạt động không phù hợp (chương trình luôn xuất ra "0,000000").

Tôi đã thử xây dựng chương trình với tùy chọn "-static" và chương trình này hoạt động trên Beagle:

root@beaglexm:/app# ./test.dynamic 1.23Value: 0,000000 [Phiên bản được liên kết động - SAU!!]root@beaglexm:/app# ./test.static 1.23Value: 1.230000 [Chính xác!!]

Tôi cũng đã thử nghiệm trên BeagleBone Black, có cách phân phối hơi khác một chút. Cả hai phiên bản (tĩnh và động) đều hoạt động tốt trên BBB.

Tìm hiểu kỹ về kho lưu trữ, tôi tìm thấy các số phiên bản sau:

Chuỗi công cụ biên dịch chéo:libc-2.9.so

BeagleBoard XM (không hoạt động):libc-2.13.so

BeagleBone Black (hoạt động!):libc-2.16.so

Vì vậy, trình biên dịch chéo của tôi được xây dựng dựa trên phiên bản cũ hơn của glibc. Tôi đã đọc ở một số nơi rằng glibc Nên tương thích ngược.

Tôi đã cân nhắc việc chỉ liên kết libc một cách tĩnh, nhưng theo câu hỏi nàyTrừ khi tất cả các thư viện được liên kết tĩnh, đây là một ý tưởng tồi.

Mọi thứ đều hoạt động tốt với liên kết tĩnh, nhưng có những hạn chế nghiêm trọng trên hệ thống, điều đó có nghĩa là tôi cần giữ tệp nhị phân càng nhỏ càng tốt.

Bạn có ý tưởng nào về điều gì có thể gây ra sự cố khủng khiếp với strtod() (và các chức năng tương tự) và/hoặc tại sao glibc 2.13 không tương thích ngược không?

biên tập:Tôi chưa đề cập rằng "soname" (tức là tên cấp cao nhất) giống nhau trên tất cả các nền tảng: "libc.so.6" Theo đọc tài liệu của tôi, số sau .so trong "soname" là số chính phiên bản và chỉ khả dụng trên Thay đổi khi giao diện thay đổi - vì vậy tất cả các phiên bản này phải tương thích. Số trước .so xuất hiện trong tên tệp thực tế (được tìm thấy qua liên kết tượng trưng, ​​​​như được hiển thị ở trên) là phiên bản phụ. Nhìn thấy:liên kết

câu trả lời hay nhất

Thông thường số phiên bản phản ánh khả năng tương thích. .Vì thế Các con số xuất hiện ở giữa và dấu chấm tiếp theo cho biết đây là phiên bản chính và không được đảm bảo tương thích với bất kỳ phiên bản chính nào khác.

Con số ngay sau nó (chỉ hiển thị nếu bạn nhấp vào liên kết tượng trưng) cho biết bản sửa đổi nhỏ. Chúng có thể được sử dụng thay thế cho nhau và các liên kết tượng trưng được sử dụng để thực hiện việc này. Chương trình này liên kết đến libc.so.6 hoặc bất cứ thứ gì khác, và trên hệ thống tập tin thực tế,libc.so.6 đang trỏ đến (ví dụ)liên kết tượng trưng libc.so.6.12.

glibc cố gắng duy trì tính tương thích giữa các phiên bản chính, nhưng đôi khi chúng chỉ phải chấp nhận những thay đổi có thể vi phạm. Thông thường, điều này xảy ra khi một phiên bản mới của tiêu chuẩn C hoặc POSIX được phát hành và các chữ ký hàm được cập nhật theo cách phá vỡ tính tương thích nhị phân.

bất cứ thứ gì xuất hiện trong.Vì thếCác số trước đó cũng có thể phá vỡ tính tương thích nếu bị thay đổi; những số này thường thể hiện sự viết lại hoàn toàn của chương trình. Ví dụ trơnglib2. Không có gì để làm với libc.

ldd Các công cụ rất hữu ích để điều tra các phần phụ thuộc của thư viện và khám phá phiên bản chính xác của thư viện thực sự được tải.

Giới thiệu về c++ - lỗi khủng khiếp với strtod(): glibc-2.13 không tương thích ngược với glibc-2.9? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/27221745/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress