Câu hỏi về liên kết thư viện trong C


8

Tôi đang học C (vẫn còn rất nhiều người mới bắt đầu) trên Linux bằng trình biên dịch GCC. Tôi đã nhận thấy rằng một số thư viện, chẳng hạn như thư viện được sử dụng với math.htiêu đề, cần phải được liên kết theo cách thủ công khi được bao gồm. Tôi đã được liên kết trong các thư viện bằng cách sử dụng các cờ khác nhau của biểu mẫu -l[library-name], chẳng hạn như -lmđối với thư viện toán học đã đề cập ở trên.

Tuy nhiên, sau khi chuyển từ dòng lệnh và / hoặc Geanysang Code::Blocks, tôi nhận thấy rằng Code::Blockssử dụng g++để biên dịch các chương trình thay vì gcctôi đã sử dụng (mặc dù dự án chắc chắn được chỉ định là C). Ngoài ra, Code::Blockskhông yêu cầu các thư viện phải được liên kết thủ công khi biên dịch - các thư viện như thư viện toán học chỉ hoạt động .

Tôi có hai câu hỏi:

Thứ nhất, có phải là "xấu" khi biên dịch chương trình C với g++trình biên dịch không? Cho đến nay nó có vẻ hoạt động, nhưng sau tất cả, C ++ không phải là C và tôi khá chắc chắn rằng g++trình biên dịch có nghĩa là cho C ++.

Thứ hai, nó có phải là g++trình biên dịch đang thực hiện liên kết tự động của các thư viện Code::Blockskhông?


1
Tôi đoán rằng Code: Blocks đặt một số biến môi trường để tìm đường dẫn cho thư viện trong môi trường xây dựng hoặc thêm thông tin này khi nó gọi trình biên dịch. Bạn có thể nhận được kết quả tương tự trên dòng lệnh. Nhiều khả năng có một số tùy chọn cài đặt trong Code: Blocks nơi bạn có thể xác định các chi tiết như vậy về môi trường xây dựng của mình. Nếu bạn đặt thông tin tương tự trong .bashrc (hoặc một số tập lệnh ini khác), bạn sẽ nhận được kết quả tương tự. Có thể đặt Code: Blocks biên dịch đầu ra thành dài dòng (nếu có thể) để xem chính xác nó làm gì.
thorsten müller

Tôi cho rằng liên kết này sẽ cung cấp cho bạn một số trợ giúp rằng tại sao trong khi biên dịch với g ++, chúng tôi không cần liên kết thủ công thư viện toán học: stackoverflow.com/questions/1033898/

Câu trả lời:


6

Cả gcc và g ++ đều nằm trong bộ sưu tập trình biên dịch GNU. Bạn nên sử dụng cái trước để biên dịch và liên kết mã C, và cái sau để thực hiện các hành động tương tự trên mã C ++. Một trong những lập luận mạnh mẽ nhất để duy trì sự khác biệt là C không phải là tập con của C ++ .

Nếu bạn liên kết bằng g ++, nó sẽ tự động liên kết trong thư viện chuẩn C ++. Vì thư viện chuẩn C là một phần của thư viện chuẩn C ++, nên thư viện toán học cũng được bao gồm. Đây là lý do tại sao bạn không cần phải liên kết trong thư viện toán học bằng tay.


3

Thứ nhất, có phải là "xấu" khi biên dịch chương trình C với trình biên dịch g ++ không?

Xác định "xấu".

Có một số điều có thể khiến chương trình C hợp lệ biên dịch trong C ++ với một ngữ nghĩa khác, nếu kinh nghiệm của tôi thích hợp, bạn có nhiều cơ hội tìm thấy UB xử lý khác nhau khi thay đổi phiên bản trình biên dịch C của bạn hơn là gặp chúng.

Trình biên dịch C ++ sẽ không biên dịch một số chương trình C hợp lệ, do đó, biên dịch C với trình biên dịch C ++ sẽ hạn chế bạn đến tập hợp con chung của chúng, đây là phiên bản chặt chẽ hơn của C. Giới hạn bản thân đối với phương ngữ C đó không phải là thành ngữ (sự khác biệt chính là cần bỏ void * khi cần một loại con trỏ khác) làm như vậy nhưng khá nhiều dự án bắt đầu sử dụng C ++ theo cách đó. Họ sử dụng trình biên dịch C ++ để có phiên bản C an toàn hơn và sau đó quyết định cho phép sử dụng các tính năng bổ sung, từng cái một, khi họ cho rằng chúng phù hợp. (Ví dụ mới nhất và công khai hơn là gcc. GCC bắt đầu được viết bằng K & R C, sau đó bắt buộc trình biên dịch ANSI C, sau đó được giới hạn trong tập hợp con phổ biến của ANSI C và C ++, và bây giờ chúng bắt đầu sử dụng C ++, một trình duyệt khác ví dụ khá công khai là các ví dụ trong phiên bản thứ hai của K &

Lưu ý rằng nếu bạn chỉ sử dụng trình biên dịch C ++, bạn sẽ nhanh chóng giới thiệu các phụ thuộc C ++ trong đó.

Cũng lưu ý rằng những điều mới trong C99 và C11 có nhiều chủ đề khác nhau hơn trong C ++.

Thứ hai, có phải trình biên dịch g ++ đang thực hiện liên kết tự động của các thư viện trong Code :: Blocks không?

Khi được sử dụng để liên kết, trình biên dịch luôn liên kết một bộ thư viện mặc định. Bộ đó cho gcc không bao gồm libm, nó được bao gồm trong bộ mặc định cho g ++. G ++ sẽ không tự động phát hiện các thư viện bổ sung nếu cần (AFAIK cũng không Code :: Blocks), libmlà một trường hợp rất đặc biệt (một số người sẽ cho rằng thực tế là gcc không liên kết nó theo mặc định là lỗi trong gcc).


+1 cho "một số người sẽ lập luận rằng thực tế là gcc không liên kết nó theo mặc định là một lỗi trong gcc". Tôi gặp vấn đề rất giống nhau, với cùng một thư viện và tôi đến đây để hỏi sự khác biệt giữa hai trình biên dịch.
Ông Lister
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.