JueWangDeMengXin 2021-08-08 17:51 采纳率: 0%
浏览 398
已结题

golang引用c++动态链接库报错 undefined reference to `test

我在使用c++动态链接库a时,有一个原本的main函数,可以调用这个动态链接库

//初始的main.cpp
#define __debug__
#define __timer__
#include "linear_gkr/zk_verifier.h"
#include "linear_gkr/zk_prover.h"
#include "linear_gkr/prime_field.h"
#include <iostream>
#include <cassert>
zk_verifier v;
zk_prover p;

int main(int argc, char** argv)
{
    //std::cout << "hello world" << std::endl;

    prime_field::init();
    p.total_time = 0;
    v.get_prover(&p);
    //std::cout << "come in" << std::endl;
    assert(argc == 4);
    v.read_circuit(argv[1], argv[2]);
    //std::cout << "after readfile" << std::endl;
    p.get_circuit(v.C);
    bool result = v.verify(argv[3]);
    printf("%s\n", result ? "Pass" : "Fail");
    return 0;
}

为了用在golang中使用,我修改了这个main函数为test.cpp与test.h

//test.h
#pragma once

#ifdef _cplusplus
extern "C"{
#endif 
    void test(char** argv);
#ifdef _cplusplus
}
#endif


//test.cpp
#include "linear_gkr/zk_verifier.h"
#include "linear_gkr/zk_prover.h"
#include "linear_gkr/prime_field.h"
#include "test/virgo.h"
#include <iostream>
#include <cassert>

void test(char** argv)
{
    //std::cout << "hello world" << std::endl;
    zk_prover p;
    zk_verifier v;
    prime_field::init();
    p.total_time = 0;
    v.get_prover(&p);
    //std::cout << "come in" << std::endl;
    v.read_circuit(argv[0], argv[1]);
    //std::cout << "after readfile" << std::endl;
    p.get_circuit(v.C);
    bool result = v.verify(argv[2]);
    printf("%s\n", result ? "Pass" : "Fail");
}

然后我将原本的动态链接库和这个test.cpp编译为一个新的动态链接库libtest.so,然后试图在golang中直接引用

//main.go
package main
/* 
#cgo CFLAGS: -I ./include
#cgo LDFLAGS: -L ./src -ltest -lstdc++
#include "test/test.h"
*/
import "C"

import "fmt"
import "unsafe"

func main(){
    box := []string{"lanczos2_112_N=16_circuit.txt","lanczos2_112_N=16_meta.txt","LOG/lanczos2_112_N=16.txt"}
    var buf []*C.char
    for i,_ := range parms {
        buf = append(buf, (*C.char)(unsafe.Pointer(C.CString(box[i]))))
    }
    parms := (**C.char)(unsafe.Pointer(&buf[0]))
    C.test(parms)
}

但是在 go build过程中一直出现
/usr/bin/ld: $WORK/b001/_x002.o: in function _cgo_1e2644dc5b75_Cfunc_test': /tmp/go-build/cgo-gcc-prolog:49: undefined reference to test'
collect2: error: ld returned 1 exit status
无论是go build还是go build main.go都一直报错,请问如何解决这个问题,是我的函数有问题吗

补充:运行环境ubuntu20.04,golanh1.15.8
问题发生在go build阶段

  • 写回答

1条回答 默认 最新

  • 王大师王文峰 企业官方账号 2021-08-09 10:03
    关注

    采纳,谢谢

    如果是IDEA开发的go 在RUN/DEBUG Configuration里修改build kind

    通过运行,在cmd窗口里,到工程的目录下执行go build是可以正确生成可执行文件,正常运行!!!

    评论

报告相同问题?

问题事件

  • 系统已结题 8月16日
  • 修改了问题 8月9日
  • 赞助了问题酬金 8月8日
  • 创建了问题 8月8日

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料