【问题标题】:Generate .so file by mixing C and C++ for DPI-C通过为 DPI-C 混合 C 和 C++ 生成 .so 文件
【发布时间】:2021-10-25 02:22:42
【问题描述】:

我有几个 .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 文件一起编译时,我得到“未定义的引用”编译错误。因此,似乎 c 和 c++ 文件之间的链接已断开,并且 vcs 编译失败。 c++ 文件是用 c 风格编写的,所以当我将 file2.cpp 的扩展名更改为 file2.c 时,一切都按预期编译和工作。

SV和DPI之间的接口是通过.c文件。也就是说,SV 从 .c 文件调用一个函数,然后从 .cpp 文件调用另一个函数。错误是对 .cpp 文件中的函数的“未定义引用”。

我找到了几个示例,展示了如何将 c OR c++ 文件编译到系统 verilog 测试平台中,但找不到结合 c 和 c++ 的示例。因此,问题似乎与混合 c 和 c++ 文件有关。

Synopsys VCS 编译器是否支持混音?我上面的编译命令是否正确?有什么想法可能是错误的吗?

【问题讨论】:

    标签: c++ c gcc system-verilog


    【解决方案1】:

    为了从 '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。

    【讨论】:

    • 我认为在极端情况下可以使用extern "C"{ #include"cheader.h" }
    • @Serge 所以,您是说我使用的每个 .cpp 文件的内容都应该包含在 extern "C"{} 中?
    • 不,我没有说任何关于 all c++ 上下文的内容。只有 DPI 或“c”程序访问的 c++ 文件中的函数定义必须包含在 extern "C" {...} 中。所有正常的 c++ 函数名称都在目标文件中被破坏。 C 函数名称没有错位。 extern C 防止它们被 c++ 破坏。
    • @Serge 你是对的 - 将所有文件包含在其中是没有意义的。但是,当我调用 foo1(),它调用 foo2(),它调用 foo3(),它们分别来自 .c、.cpp、.cpp 文件时,编译器会抱怨 foo3() 未定义。所以,封闭似乎是必要的。一定有什么我错过了......
    • 你需要提供一个例子。 'foo1' 在 'c' 文件中并由 'c' 编译器编译,只有当 foo2 在 cpp 文件中声明为外部“C”时,它才能调用 'foo2'。 'foo2' 可以调用 any c++ 函数,有或没有 extern "C"。如果你想从 'c++' 调用一个 'c' 函数,你还需要将它的原型声明为 extern "C"。如果您在此方案中缺少符号,则仅表示您未提供链接所需的所有文件。
    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多