dongxi1680 2018-01-26 04:58
浏览 34
已采纳

`go build` vs`go build file.go`

I am having trouble building a very simple go program that calls c code via cgo. My setup:

$: echo $GOPATH
/go
$: pwd
/go/src/main
$: ls
ctest.c  ctest.h  test.go

test.go contains: package main

// #include "ctest.c"
// #include <stdlib.h>
import "C"
import "unsafe"
import "fmt"

func main() {
  cs := C.ctest(C.CString("c function"))
  defer C.free(unsafe.Pointer(cs))
  index := "hello from go: " + C.GoString(cs)
  fmt.Println(index)
}

ctest.h contains:

char* ctest (char*);

ctest.c contains:

#include "ctest.h"

char* ctest (char* input) {
  return input;
};

When I run go build test.go I get a binary, test that I can run which prints the expected hello from go: c function

However when I run go build I get the error:

# main
/tmp/go-build599750908/main/_obj/ctest.o: In function `ctest':
./ctest.c:3: multiple definition of `ctest'
/tmp/go-build599750908/main/_obj/test.cgo2.o:/go/src/main/ctest.c:3: first defined here
collect2: error: ld returned 1 exit status

What is happening with go build that is not in go build test.go that is causing the error?

  • 写回答

1条回答 默认 最新

  • dq1685513999 2018-01-26 06:38
    关注

    Read your code carefully. Read the error message. Correct your error:

    // #include "ctest.h"
    

    test.go:

    package main
    
    // #include "ctest.h"
    // #include <stdlib.h>
    import "C"
    import "unsafe"
    import "fmt"
    
    func main() {
      cs := C.ctest(C.CString("c function"))
      defer C.free(unsafe.Pointer(cs))
      index := "hello from go: " + C.GoString(cs)
      fmt.Println(index)
    }
    

    ctest.h:

    char* ctest (char*);
    

    ctest.c:

    #include "ctest.h"
    
    char* ctest (char* input) {
      return input;
    };
    

    Output:

    $ rm ./test
    $ ls
    ctest.c  ctest.h  test.go
    $ go build
    $ ls
    ctest.c  ctest.h  test  test.go
    $ ./test
    hello from go: c function
    $ 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题