Golang中如何调用与go应用相同的共享库init函数
Golang中如何调用与go应用相同的共享库init函数
我使用 -linkshared -buildmode=shared 选项创建了一个共享库 cavwrapperlib。
我在其中编写了 init 方法。我已经将这个库与应用程序一起加载,并使用 go build -linkshared main.go 编译了我的应用程序。
如何在不从应用程序中显式调用的情况下,像 C 语言支持 __attribute__((constructor)) 那样,调用库的方法?
package cavwrapperlib
import "fmt"
func init() {
fmt.Println("Init called")
}
package main
import "cavwrapperlib"
func main(){
fmt.Println("inside main")
}
更多关于Golang中如何调用与go应用相同的共享库init函数的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你是想问如何在不执行其 init 函数的情况下加载一个共享库包吗?
更多关于Golang中如何调用与go应用相同的共享库init函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
他想问的是,我们是否有办法调用 init() 函数,然后在 init 函数中执行一些操作。我们试图实现的是通过 init 函数初始化一些原生代码,这样我们就不需要对主应用程序做任何修改。一旦应用程序运行,init 函数内的代码就应该执行。
在Go中,共享库的init()函数会在库被加载时自动执行,不需要显式调用。根据你的描述,问题可能在于构建或链接方式。以下是正确的做法:
首先,确保共享库正确构建:
# 构建共享库
go install -buildmode=shared -linkshared cavwrapperlib
然后构建主程序:
# 构建主程序
go build -linkshared main.go
如果init()仍然没有执行,可能是因为共享库没有被正确链接。检查以下几点:
- 确保库路径正确:
# 设置共享库路径
export LD_LIBRARY_PATH=$GOPATH/pkg/linux_amd64_dynlink:$LD_LIBRARY_PATH
- 使用
ldd验证链接:
ldd main
# 应该显示类似:
# libcavwrapperlib.so => /path/to/libcavwrapperlib.so
- 完整示例:
共享库代码 (cavwrapperlib/cavwrapperlib.go):
package cavwrapperlib
import "fmt"
func init() {
fmt.Println("cavwrapperlib init called")
}
func SomeFunction() {
fmt.Println("SomeFunction called")
}
主程序 (main.go):
package main
import (
"fmt"
_ "cavwrapperlib" // 使用下划线导入确保init执行
)
func main() {
fmt.Println("inside main")
// cavwrapperlib.SomeFunction() // 可选调用
}
构建步骤:
# 1. 构建共享库
go install -buildmode=shared -linkshared cavwrapperlib
# 2. 构建主程序
go build -linkshared main.go
# 3. 运行
./main
预期输出:
cavwrapperlib init called
inside main
如果问题仍然存在,检查Go版本(需要1.8+支持共享库)和构建环境。可以使用-x标志查看详细构建过程:
go build -x -linkshared main.go

