英文:
GoLang: main not finding shared library used by module
问题
我正在构建一个Go模块,大致如下所示:
package eos
/*
#cgo LDFLAGS: -L${SRCDIR}/vendor/MyLibrary/1.14.2/Bin/Linux -lMY_SDK-Linux-Shipping
#cgo CFLAGS: -I ${SRCDIR}/vendor/MyLibrary/1.14.2/Include
#include "my_sdk.h"*/
import "C"
func useMyCFunc() void {
C.myCFunc()
}
然后我有一个名为hello.go
的主文件:
package main
import (
"helloworld/eos"
)
func main() {
eos.useMyCFunc()
}
目录结构如下:
-helloworld/
|
- hello/
|
- hello.go
|
-eos/
|
- eos.go
|
- vendor/
|
- (所有所需的库文件)
这些是我用来构建程序的命令:
cd eos
go mod init helloworld/eos
cd ../hello
go mod init helloworld/hello
go mod edit -replace helloworld/eos=../eos
go mod tidy
go build .
这些命令都没有返回任何错误。然而,当我从/hello
目录运行go run .
时,我得到以下错误:
/tmp/go-build2142984290/b001/exe/hello: error while loading shared libraries: libMY_SDK-Linux-Shipping.so: cannot open shared object file: No such file or directory
这个文件确实存在,并且位于helloworld/eos/vendor/MyLibrary/1.14.2/Bin/Linux/libMY_SDK-Linux-Shipping.so
,正如eos.go
中的LDFLAGS所指定的那样。
为什么hello.go
找不到这个文件?
英文:
I'm building a module in go, it looks something like this:
package eos
/*
#cgo LDFLAGS: -L${SRCDIR}/vendor/MyLibrary/1.14.2/Bin/Linux -lMY_SDK-Linux-Shipping
#cgo CFLAGS: -I ${SRCDIR}/vendor/MyLibrary/1.14.2/Include
#include "my_sdk.h"*/
import "C"
func useMyCFunc() void {
C.myCFunc()
}
Then I have hello.go
which is my main:
package main
import (
"helloworld/eos"
)
func main() {
eos.useMyCFunc()
}
The directory structure is as follows:
-helloworld/
|
- hello/
|
- hello.go
|
-eos/
|
- eos.go
|
- vendor/
|
- (all the required lib files)
These are the commands I run to build the program:
cd eos
go mod init helloworld/eos
cd ../hello
go mod init helloworld/hello
go mod edit -replace helloworld/eos=../eos
go mod tidy
go build .
None of these return any kind of error.
However, when I run go run .
from /hello
, I get this error:
/tmp/go-build2142984290/b001/exe/hello: error while loading shared libraries: libMY_SDK-Linux-Shipping.so: cannot open shared object file: No such file or directory
This file does exist, and is located at helloworld/eos/vendor/MyLibrary/1.14.2/Bin/Linux/libMY_SDK-Linux-Shipping.so
, as specified in the LDFLAGS of eos.go
.
Why can hello.go
not find this file?
答案1
得分: 1
关于@rocka2q提到的CGo,除此之外,useMyCFunc()
需要大写才能在eos
包之外访问。
英文:
On top of what @rocka2q mentioned about CGo, useMyCFunc()
needs to be capitalized for it to be accessible to outside of the eos
package.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论