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

Golang c-shared on linux - ld cannot find -ltest

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

中的说明进行操作

我的项目比较简单。该库有一个带有 println 的测试函数。正如标题所说,我得到 'cannot find'.

我 运行 Ubuntu 很兴奋,去 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

test.c

#include "test.h"

int main() {
    test();
}

lib.go

package main

import "fmt"
import "C"


//export test
func test() {
    fmt.Println("test")
}

func main() {}

test.h 和 test.so 是通过以下方式生成的:go build -o test.so -buildmode=c-shared test.go

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,但谷歌搜索表明该调用也适用于 gcc。

Post 解决方案

一些额外的评论:

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

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

尝试 gcc -o test test.c -L. -l:test.so 到 link 图书馆。

注意你说的指令中go build命令行的区别 您正在关注:

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

和你自己的 go build 命令:

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

根据 链接器的文档考虑这种差异 选项 -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