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 解决方案
一些额外的评论:
go func test() {}
中的函数名称将在 nm 中显示为 _test
但应在 C 中声明为 extern void test();
出于某种原因,调用 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
我正在尝试按照 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 解决方案
一些额外的评论:
go
func test() {}
中的函数名称将在 nm 中显示为_test
但应在 C 中声明为extern void test();
出于某种原因,调用
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