Cách gọi hàm C++ từ chương trình D? Tôi vẫn không thể hiểu cách thực hiện. Tôi cần thực hiện các lệnh nào? Tôi sử dụng dmd trong Fedora.Gọi C++ (C) từ ngôn ngữ D
Trả lời
ví dụ đơn giản nhất tôi có thể nghĩ ra, nếu bạn đang gọi điện thoại chức năng C:
$ cat a.c
int f(int a, int b){
return a + b + 42;
}
$ cat a.di
extern (C):
int f(int, int);
$ cat b.d
import std.stdio;
import a;
void main(){
writeln(f(100, 1000));
}
$ gcc -c a.c
$ dmd b.d a.o
$ ./b
1142
$
Nếu bạn đang sử dụng đối tượng chia sẻ, bạn có thể để một cái gì đó như:
$ cat sdltest.di
module sdltest;
extern (C):
struct SDL_version{
ubyte major;
ubyte minor;
ubyte patch;
}
SDL_version * SDL_Linked_Version();
$ cat a.d
import std.stdio;
import sdltest;
void main(){
SDL_version *ver = SDL_Linked_Version();
writefln("%d.%d.%d", ver.major, ver.minor, ver.patch);
}
$ dmd a.d -L-lSDL
$ ./a
1.2.14
$
Trong ví dụ này , Tôi đã liên kết với hàm SDL. Đối số -L
cho dmd
cho phép bạn chuyển đối số đến ld
, trong trường hợp này là -lSDL
để liên kết với SDL.
D tệp giao diện (.di
) được mô tả here.
Bạn cũng nên xem htod.
Tuyệt vời! Cảm ơn nhiều. Nó hoạt động. Tệp .di là gì? Tôi đã không đọc về nó trước đây. – Stan
Vì vậy, ví dụ, để sử dụng libxml tôi cần phải viết các ràng buộc cho các chức năng mà tôi sẽ sử dụng, phải không? – Stan
@StanislavFeldman: Tôi nghĩ vậy, trừ khi ai đó đã làm điều đó trước đây. Một số thư viện phổ biến đã có liên kết D. Bạn có cần libxml không? D có mô-đun ['std.xml'] (http://dlang.org/phobos/std_xml.html). Tôi cũng đã thêm một ví dụ biên dịch với các thư viện được chia sẻ. – Vlad
Hãy thử xem http://dlang.org/interfaceToC.html, mặc dù nó có vẻ chỉ hoạt động với C. Bạn có thể xem các đề xuất ở đây về cách giao diện với C++: http://dlang.org/cpp_interface. html –
Tôi đã xem hướng dẫn đó. Nó bị mất mô tả về tập tin .di. Cảm ơn Vlad đã chia sẻ với tôi giải pháp. – Stan