在仓颉语言中调用C/C++动态库

前言

仓颉语言的试用通过了,看了一下仓颉的语法,整体还是还可以的,融入不少语言的特性的,因为仓颉语言目前来说是没有什么生态的,所以更多的时候,还是调用C/C++生态,这里只是学习调用C/C++动态库

C语言代码,并生成动态库

_declspec(dllexport) int _stdcall add(int64_t a, int64_t b)
{
	return a + b;
}

_declspec(dllexport) void _stdcall cprint(char* msg)
{
	printf("%s\n", msg);
}

仓颉调用C语言动态库(Windows)

// from std import random.*  //早期版本引入包的语法
import std.random.*          //在0.53.4之后,可以这样引入包

//foregin 声明外部函数 
foreign func add(a: Int64, b: Int64): Int64

foreign func cprint(msg: CString): UInt64

main() {
    let num = Random().nextInt32();
    println("num=${num}")

    unsafe {
        var sum: Int64 = add(10, 20);  //调用C动态库中add函数
        println("c add func exec result = ${sum}");

        var msg: CString = LibC.mallocCString("hello cangjip"); //声明一个c语言字符串
        var num: UInt64 = cprint(msg);  //将字符串通过cprint函数传达到C语言动态库中
        print("${num}");
        
        LibC.free(msg);  //释放msg字符串
    }
    return 0
}

编译命令:

# -L(要链接的文件路径) .(当前目录)  -l (指定链接库) DllApp(动态库的名称)
cjc .\hello.cj -L . -l DllApp -o hello.exe

仓颉语言编译和链接动态库,调用C语言函数

秋风 2024-07-14