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

3 回复

你是想问如何在不执行其 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()仍然没有执行,可能是因为共享库没有被正确链接。检查以下几点:

  1. 确保库路径正确
# 设置共享库路径
export LD_LIBRARY_PATH=$GOPATH/pkg/linux_amd64_dynlink:$LD_LIBRARY_PATH
  1. 使用ldd验证链接
ldd main
# 应该显示类似:
#   libcavwrapperlib.so => /path/to/libcavwrapperlib.so
  1. 完整示例

共享库代码 (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
回到顶部