通过混合 C 和 C++ 为 DPI-C 生成 .so 文件
Generate .so file by mixing C and C++ for DPI-C
我有几个 .c 和 .cpp 文件,我想将它们作为单个 .so 共享对象文件连接到 System Verilog 测试平台。我采用的方法是使用单独的 .o 文件编译成单个 .so 文件,然后在 vcs 编译期间与其余 SV 文件一起添加。
gcc -w -pipe -fPIC -O -c file1.c -o file1.o
gcc -w -pipe -fPIC -O -c -x c++ file2.cpp -o file2.o
gcc -shared -o libr.so file1.o file2.o
使用这种方法,C 语言编译没有错误,但是当我尝试编译 verilog 测试平台和 libr.so 文件时,出现 'undefined reference' 编译错误。所以,看起来 c 和 c++ 文件之间的链接被破坏了,vcs 编译失败了。 c++ 文件是用 c 风格编写的,所以当我将 file2.cpp 的扩展名更改为 file2.c 时,一切都按预期编译和工作。
SV和DPI之间的接口是通过.c文件。也就是说,SV 从 .c 文件调用一个函数,然后从 .cpp 文件调用另一个函数。错误是对 .cpp 文件中函数的“未定义引用”。
我找到了几个说明如何将 c 或 c++ 文件编译到系统 verilog 测试台中的示例,但找不到结合 c 和 c++ 的示例。所以,问题似乎与混合 c 和 c++ 文件有关。
Synopsys VCS 编译器是否支持混合?我上面的编译命令是否正确?有什么可能出错的想法吗?
为了从 'c' 调用 c++ 函数,必须使用 extern "C"
绑定声明 c++ 函数,例如:
extern "C" void foo(int);
或
extern "C" {
void bar();
}
现在您可以从 'c'
调用 foo(3)
或 bar()
此外,您不需要额外的 'c' 文件来在系统 verilog 中定义 DPI 函数。您仍然可以在您的 C++ 文件中使用 extern "C"
,并将这些函数用于 DPI。
我有几个 .c 和 .cpp 文件,我想将它们作为单个 .so 共享对象文件连接到 System Verilog 测试平台。我采用的方法是使用单独的 .o 文件编译成单个 .so 文件,然后在 vcs 编译期间与其余 SV 文件一起添加。
gcc -w -pipe -fPIC -O -c file1.c -o file1.o
gcc -w -pipe -fPIC -O -c -x c++ file2.cpp -o file2.o
gcc -shared -o libr.so file1.o file2.o
使用这种方法,C 语言编译没有错误,但是当我尝试编译 verilog 测试平台和 libr.so 文件时,出现 'undefined reference' 编译错误。所以,看起来 c 和 c++ 文件之间的链接被破坏了,vcs 编译失败了。 c++ 文件是用 c 风格编写的,所以当我将 file2.cpp 的扩展名更改为 file2.c 时,一切都按预期编译和工作。
SV和DPI之间的接口是通过.c文件。也就是说,SV 从 .c 文件调用一个函数,然后从 .cpp 文件调用另一个函数。错误是对 .cpp 文件中函数的“未定义引用”。
我找到了几个说明如何将 c 或 c++ 文件编译到系统 verilog 测试台中的示例,但找不到结合 c 和 c++ 的示例。所以,问题似乎与混合 c 和 c++ 文件有关。
Synopsys VCS 编译器是否支持混合?我上面的编译命令是否正确?有什么可能出错的想法吗?
为了从 'c' 调用 c++ 函数,必须使用 extern "C"
绑定声明 c++ 函数,例如:
extern "C" void foo(int);
或
extern "C" {
void bar();
}
现在您可以从 'c'
调用foo(3)
或 bar()
此外,您不需要额外的 'c' 文件来在系统 verilog 中定义 DPI 函数。您仍然可以在您的 C++ 文件中使用 extern "C"
,并将这些函数用于 DPI。