gpt4 book ai didi

gcc - Linux 上的 Golang c-shared - ld 找不到 -ltest

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:28 25 4
gpt4 key购买 nike

我正在尝试按照 http://snowsyn.net/2016/09/11/creating-shared-libraries-in-go/ 中的说明进行操作

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

我正在运行 Ubuntu zesty 并升级到 1.7.4

ls -l

roy@roy-desktop:~/go/src/c$ ls -l
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.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。

发布解决方案

一些额外的评论:

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

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

最佳答案

注意你说的指令中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 linkeroption -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

关于gcc - Linux 上的 Golang c-shared - ld 找不到 -ltest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47736729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com