代码之家  ›  专栏  ›  技术社区  ›  Roy Falk

linux上的Golang c-shared-ld找不到-ltest

  •  0
  • Roy Falk  · 技术社区  · 7 年前

    我试着按照 http://snowsyn.net/2016/09/11/creating-shared-libraries-in-go/

    我的项目比较简单。该库有一个带有println的测试函数。正如标题所说,我得到的是“找不到”。

    我正在运行Ubuntu zesty和go 1.7.4

    ls-l

    roy@roy-desktop:~/go/src/c$ ls -l total 2016 -rw-rw-r-- 1 roy roy 43 Dec 10 06:55 test.c -rw-rw-r-- 1 roy roy 1274 Dec 10 06:54 test.h -rw-rw-r-- 1 roy roy 2053664 Dec 10 06:54 test.so

    测验c

    #include "test.h"
    
    int main() {
        test();
    }
    

    lib。去

    package main
    
    import "fmt"
    import "C"
    
    
    //export test
    func test() {
        fmt.Println("test")
    }
    
    func main() {}
    

    测验h和试验。所以生成时使用:go build-o test。so-buildmode=c共享测试。去

    gcc调用失败如下:

    roy@roy-desktop:~/go/src/c$ gcc -o test test.c -L. -ltest
    /usr/bin/ld: cannot find -ltest
    collect2: error: ld returned 1 exit status
    

    最初的示例使用了clang,但google表明调用也应该适用于gcc。

    后期解决方案

    一些额外的评论:

    1. go中的函数名 func test() {} 将以nm为单位显示为 _test 但应在C中声明为 extern void test();

    2. 出于某种原因,调用 go build -buildmode=c-shared 在OSX上不生成头文件,但在Linux上生成。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Mike Kinghan    7 年前

    注意您所说的指令中go build命令行之间的差异 您正在执行以下操作:

    go build -o libimgutil.so -buildmode=c-shared imgutil.go
                +++^^^^^^^^^^                     ^^^^^^^^^^ 
    

    以及您自己的go build命令:

    go build -o test.so -buildmode=c-shared test.go
                ^^^^^^^                     ^^^^^^^
    

    从以下方面考虑这种差异: the documentation of the linker option -l | --library

    -l namespec
    --library=namespec
    
    Add the archive or object file specified by namespec to the list of files to link.
                                                ^^^^^^^^
    This option may be used any number of times. If namespec is of the form :filename,
                                                    ^^^^^^^^                +^^^^^^^^
    ld will search the library path for a file called filename, otherwise it will
                                                      ^^^^^^^^
    search the library path for a file called libnamespec.a.
                                              +++^^^^^^^^++
    On ... ELF and SunOS systems, ld will search a directory for a library called
    libnamespec.so before searching for one called libnamespec.a. (By convention,
    +++^^^^^^^^+++                                 +++^^^^^^^^++
    a .so extension indicates a shared library.) ...
    

    这将向您展示go build命令需要:

    go build -o libtest.so -buildmode=c-shared test.go
    
        2
  •  0
  •   cshu    7 年前

    尝试 gcc -o test test.c -L. -l:test.so 链接库。