2010-09-28 43 views
5

Tôi có một hàm được viết bằng C (Nói trong tệp HelloWorld.c). Tôi muốn biên dịch điều này và cần phải tạo một tệp đối tượng cổ xưa HelloWorld.aLàm cách nào để liên kết tệp đối tượng C tĩnh với Perl?

Cuối cùng tôi cần gọi điều này từ một chương trình Perl (HelloWorld.pl).

+2

[Làm cách nào để truy cập tệp thư viện .a trong Perl?] (Http: // stackoverflow.com/q/3733346) – daxim

+0

Nếu bạn chỉ muốn chạy một số mã C từ perl, chỉ cần biên dịch nó như là một chương trình C độc lập và gọi nó trên dòng lệnh có thể làm việc :) Hoặc có thể một cái gì đó như gearman có thể hữu ích .. –

Trả lời

9

Để gọi từ perl đến C, thường biên dịch một thư viện chia sẻ, không tĩnh, từ mã c, sau đó tải nó vào trình thông dịch perl sử dụng mô-đun XSLoader hoặc DynaLoader.

Để sau đó có thể gọi mã C từ không gian perl có nhiều cách. Một trong những phổ biến nhất là viết một cái gì đó gọi là XSUB s, trong đó có một giao diện perl-side, bản đồ các cuộc gọi perl-ước để C gọi-công ước, và gọi các chức năng C. Những XSUB này thường cũng được liên kết trong thư viện được chia sẻ sẽ được tải vào perl và được viết bằng một ngôn ngữ có tên là XS, được ghi lại rộng rãi trong perlxsperlxstut.

Ngoài ra còn có các cách khác để xây dựng lớp trình bao bọc đó, giống như các trình tạo mã XS khác nhau, cũng như SWIG. Nhưng bạn cũng có thể gọi trực tiếp đến các hàm C bằng cách sử dụng NCI. Perl cũng có rất nhiều trong số đó. Các P5NCI là một ví dụ về những người, các mô-đun ctypes phát triển trong chương trình năm nay của Google Summer of Code là một.

Một kỹ thuật liên quan khác có lẽ nên được đề cập ở đây là Inline::C và các mô-đun khác của dòng Inline. Chúng cho phép bạn viết mã bằng các ngôn ngữ khác trực tiếp trong perl và gọi nó. Dưới mui xe Inline :: C chỉ xây dựng mã XS và tải kết quả của nó vào trình thông dịch.

3

Như @rafl cho biết, bạn nên sử dụng thư viện được chia sẻ.

Nếu bạn phải sử dụng thư viện tĩnh, thì bạn phải xây dựng lại Perl với thư viện tĩnh được tích hợp sẵn. Bạn cũng sẽ cần một số nhãn XS. Tuy nhiên, điều này là đủ lộn xộn mà bạn thực sự, thực sự không muốn làm điều đó.

2

Theo perlxstut:

Người ta thường nghĩ rằng nếu một hệ thống không có khả năng để tự động tải một thư viện, bạn không thể xây dựng XSUBs. Điều này là không chính xác. Bạn có thể xây dựng chúng, nhưng bạn phải liên kết các chương trình con XSUB với phần còn lại của Perl, tạo một tệp thực thi mới. Tình trạng này tương tự như Perl 4.

Hướng dẫn này vẫn có thể được sử dụng trên hệ thống như vậy. Cơ chế xây dựng XSUB sẽ kiểm tra hệ thống và xây dựng một thư viện tự động tải nếu có thể, hoặc một thư viện tĩnh khác và sau đó, tùy chọn, một tệp thực thi được liên kết tĩnh mới với thư viện tĩnh được liên kết trong.

Nếu bạn muốn xây dựng một tệp thực thi được liên kết tĩnh trên một hệ thống có thể tải thư viện động, bạn có thể, trong tất cả các ví dụ sau, khi lệnh "make" không có đối số nào được thực hiện, hãy chạy lệnh "make perl".

Nếu bạn đã tạo tệp thực thi được liên kết tĩnh như vậy theo lựa chọn, sau đó thay vì nói "make test", bạn nên nói "make test_static". Trên tất cả các hệ thống không thể xây dựng thư viện có khả năng tải động, chỉ cần nói "make test" là đủ.

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