2012-10-19 29 views
8

Có bất kỳ sự đồng nhất hoặc biến thể nào giữa các bản phân phối có thể ảnh hưởng đến các tệp nhị phân C++ được biên dịch bằng GCC 4.7.x trên một bản phân phối đang được sử dụng trực tiếp trên một bản phân phối khác không? Tôi hiểu rằng tình hình lý tưởng là để biên dịch từ nguồn trên bản phân phối thứ hai nhưng tôi thực sự không muốn lo lắng về việc biên dịch các phiên bản GCC mới và mã nguồn chương trình trên máy sản xuất của mình. Tôi là một người dùng Linux khá thiếu kinh nghiệm (do đó câu hỏi này!) Và vẫn thích IDE như trái ngược với biên dịch dòng lệnh, ssh là tất cả những gì tôi thực sự có thể sử dụng để truy cập vào máy sản xuất.Có hạn chế nào đối với các tệp thi hành được biên dịch bằng g ++ trên một bản phân phối Linux đang được sử dụng trên một bản phân phối Linux khác không?

Bản thân mã không có gì thú vị nhưng nó sử dụng một số hoạt động của các cơ sở hệ điều hành máy xay như chặn ổ cắm và các loại tương tự.

Bất kỳ lời khuyên nào sẽ được đánh giá rất nhiều!

+4

Câu trả lời phụ thuộc rất nhiều vào nếu bạn liên kết tĩnh hoặc động – PlasmaHH

+2

không nên là một vấn đề trừ khi một trong là 64 bit và thứ hai là 32 bit, hoặc nếu họ có các phiên bản khác nhau đáng kể trong những chia sẻ khác nhau thư viện được cài đặt. Nếu bạn muốn tính di động tối đa, bạn nên làm cho nó được liên kết tĩnh. –

+3

@PaulTomblin: Nếu bạn muốn tính di động tối đa, bạn nên biên dịch từ nguồn. –

Trả lời

5

Trừ những chương trình được xây dựng trên chính xác cùng hệ điều hành (bao gồm cả phiên bản) và chính xác cùng một phần cứng không có bảo đảm.

Trong thực tế:

  1. Nếu phần cứng là cùng một gia đình của chip nó nên làm việc.

    • Điều này là do hầu hết mọi người không bật tối ưu hóa phần cứng cụ thể (nhưng chúng có thể).
    • binaries Di chuyển trên chipset là rất khó để làm việc
    • Di chuyển mã nhị phân từ cũ cho các thành viên mới của một gia đình phần cứng có khả năng làm việc
    • Di chuyển mã nhị phân từ mới cho các thành viên cũ của một gia đình phần cứng là ít có khả năng (nhưng sẽ phụ thuộc vào các thiết lập tối ưu hóa và biên dịch (ir di chuyển 64-32 trúc bit là khó có khả năng làm việc).
  2. Nếu hệ điều hành có số lượng lớn cùng sau đó nó nên (có thể) làm việc.

    • Phiên bản hệ điều hành mà nhị phân sẽ hoạt động trên sẽ phụ thuộc vào phiên bản trình biên dịch được sử dụng để tạo và hệ điều hành máy chủ.
    • Nếu trình biên dịch có thay đổi trong ABI nó tạo ra thì tất cả các phiên cược sẽ bị tắt. Nhưng thường một sự thay đổi trong ABI được tạo ra bởi trình biên dịch sẽ là một vấn đề lớn và do đó chỉ xảy ra tại các điểm chính trong bản đồ đường OS (không phải ở các bước tăng nhỏ).
  3. Lời khuyên của tôi được tạo từ nguồn.

    • Không đặc biệt ra ngoài và cập nhật môi trường phát triển (sử dụng môi trường đi kèm với phân phối (nếu bạn cập nhật mặc định, chúng sẽ không phá vỡ tính tương thích ngược)).
    • Tòa nhà thật dễ dàng chỉ cần đọc tệp README. Nhưng thường nó liên quan đến việc chạy hai lệnh ./configuremake. Nếu bạn không muốn bất cứ điều gì đặc biệt bạn thường không cần phải làm bất cứ điều gì khác.
+0

Cảm ơn bạn đã trả lời kỹ lưỡng. Nhiều đánh giá cao! Lý do chính tôi nói về các phiên bản GCC mới nhất cụ thể là tôi rất quan tâm đến các tính năng C++ 11 mới. Tôi cảm thấy thoải mái (nhiều hơn hoặc ít hơn) với việc xây dựng GCC và một số phụ thuộc (MPFR và hai thứ khác mà tôi đã quên tên) từ nguồn nhưng thời gian biên dịch/sử dụng tài nguyên trên một máy sản xuất và lo lắng về việc duy trì một cài đặt GCC khác cảm thấy khó xử. Những gì tôi * không * biết cách làm (nhưng muốn tìm hiểu khi nào tôi có thời gian) là biên dịch dự án của riêng tôi từ thiết bị đầu cuối (heh, tôi suck!) Hoặc sử dụng makefiles đúng cách. – Elliott

+0

Tôi thực sự muốn thử nó trước và sau đó suy nghĩ về xây dựng từ nguồn tại một thời điểm khi tôi cảm thấy thoải mái hơn khi làm điều đó. Bản thân mã là tất cả những thứ khá cao cấp, thứ di động nhỏ nhất mà tôi có thể tìm thấy là một hoặc hai bitmask.Dựa trên câu trả lời của bạn, tôi đã xem xét những điều sau: cả hai CPU là x64 từ cùng một nhà cung cấp chạy Linux 64 bit và bản phân phối là các phiên bản mới nhất, có lẽ, có phiên bản hạt nhân rất giống nhau. Và dựa trên đó, tôi đã quyết định nó có lẽ cũng có giá trị một shot. Cảm ơn một lần nữa vì lời khuyên âm thanh! – Elliott

+0

Một điều nữa, nếu bạn sẽ: những yếu tố thực sự là gì khi chơi ở đây? Khi tôi "hiểu" (theo nghĩa lỏng lẻo), chúng là: tính di động của các lệnh được tạo ra, ABI, các phiên bản của thư viện thời gian chạy (có lẽ là tầm thường nếu được liên kết tĩnh) và các phiên bản của bất kỳ thư viện OS nào cho những thứ như ổ cắm (được xác định bởi phiên bản hạt nhân?). Nhưng tôi vẫn có thể sủa cây sai! :) – Elliott

0

Nói chung, các tệp nhị phân được xây dựng trên phân phối mới hơn không hoạt động trên phiên bản cũ hơn, nhưng các tệp nhị phân được xây dựng trên phân phối cũ hơn sẽ hoạt động phân phối mới hơn. Bây giờ, nếu bạn xây dựng nhị phân trên RedHat EL4, nó sẽ hoạt động trên hầu hết các bản phân phối được hỗ trợ. (Bạn có thể cần phải sao chép libstdC++ nếu thiếu)

3

G ++ đã có một ABI ổn định trong một thời gian gây ra vấn đề. Điều có thể gây ra sự cố là sử dụng thư viện được liên kết động. Hệ thống chạy chương trình sẽ cần phải có các phiên bản tương thích của bất kỳ thư viện được chia sẻ nào mà tệp thực thi được biên dịch. Nếu bạn chỉ sử dụng liên kết tĩnh, bạn không nên gặp sự cố. Bạn có thể bật liên kết tĩnh bằng cách sử dụng tùy chọn -static.

+2

Không còn đúng, thật đáng buồn. G ++ 4.7.0 và 4.7.1 có một số thay đổi stdlib ảnh hưởng đến ABI, và 4.7.2 có sự không tương thích ABI ["cố định"] (http://gcc.gnu.org/gcc-4.7/changes.html), về cơ bản có nghĩa là cả 4.7.0 lẫn 4.7.1 và 4.7.2 đều không tương thích với bất kỳ phiên bản trước nào hoặc với bất kỳ phiên bản nào khác. – Damon

+0

Cảm ơn bạn đã trả lời và cảm ơn @Damon vì thông tin, rất hữu ích! Tôi đã không có khiếu nại về việc đảm bảo rằng tôi đã có các thư viện thời gian chạy đúng vv nhưng tôi không biết những gì tôi đang tìm kiếm cho đến khi tôi đọc điều đó :) – Elliott

3

Với liên kết tĩnh, hai điều kiện phải được đáp ứng:

1) Hệ thống mục tiêu và xây dựng hệ thống phải có cùng một kiến ​​trúc (với ngoại lệ: bạn có thể chạy mã nhị phân 32-bit trên nhiều host 64-bit)

2) (g) gói libc trên hệ thống mục tiêu không phải là một phiên bản cũ hơn trên hệ thống xây dựng (đôi khi bạn có thể nhận được ngay với sự khác biệt phiên bản nhỏ)

Nó trở nên phức tạp hơn với liên kết động.

+0

lý do tại sao glibc nói riêng? – qdii

+0

cũng vậy, nếu tôi không cần bất kỳ thứ gì khác, bạn có thể đảm bảo rằng nếu tôi biên dịch mã của tôi bằng công tắc GCC "-march = corei7" thì nó sẽ hoạt động trên tất cả các nền tảng 64 bit không? – qdii

+0

@qdii Bằng những âm thanh của nó, không có sự bảo đảm nào có được ở bất cứ đâu ở đây! – Elliott

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