C语言和SV的混合编译举例

其实很简单,就是两种不同的语言链接成可执行文件让编译工具能够识别就可以了,具体如下。

一个C语言的动态库

首先,我们要编译一个动态库。什么是动态库?动态库就是*.so文件。

下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_example.h,三个.c文件:example_a.c、example_b.c、example_c.c,我们将这几个文件编译成一个动态库:libexample.so。

//so_example.h文件如下:

#include "stdio.h"

void example_a();

void example_b();

void example_c();

//example_a.c文件如

#include "so_example.h"

void example_a() { 

printf("this is in example_a...\n");

}

//example_b.c文件如下

include "so_example.h"

void example_b() { 

printf("this is in example_b...\n");

}

//example_c.c文件如下:

#include "so_example.h"

void example_c() { 

printf("this is in example_c...\n");

}

将这几个文件编译成一个动态库:libexample.so。

gcc example_a.c example_b.c example_c.c -fPIC -shared -o libexample.so

动态库链接

上一章节,我们已经成功生成了一个自己的动态链接库libexample.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:example.c(这里就是你自己的case名字)。

example.c文件如下:

#include "so_example.h"

int main() {

example_a();

example_b();

example_c();

return 0;}

将example.c与动态库libexample.so链接生成执行文件example:

gcc example.c -L. -lexample -o example

-shared该选项指定生成动态链接库,不用该标志外部程序无法链接。此相当于一个可执行文件

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-L.:表示要链接的库在当前目录中

-lexample:编译器查找动态链接库时有隐含的命名规则,即在给出的名字(example)前面加上lib,后面加上.so来确定库的名称。


如下加载在你的makefile文件中就可以了

vcs -debug_all -full64 -sverilog –R –f sv_filelist libexample.so

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容