go - undefined reference to error 仅针对某些函数

标签 go cgo cflags ldflags

我有一个库和一个为它构建的 C 接口(interface)。 我的程序使用 versionString() 编译得很好,但使用 loadConfig() 就不行。这怎么可能?

walker.h :

#ifndef WFE_C_H
#define WFE_C_H

#ifdef __cplusplus
extern "C" {
#endif

  const char* versionString();

  void* loadConfig(const char *filePath, char* errorMessageBuffer, int bufferLen);

#ifdef __cplusplus
}
#endif

#endif

工作版本:

package main

/*
#cgo CFLAGS: -Isrc/walker
#cgo LDFLAGS: -L${SRCDIR}/lib -lwalker
#include "walker.h"
*/
import (
    "C"
)
func main() {
    p := C.versionString()
    version := C.GoString(p)
    fmt.Println(version)
}
// output: v1.94

无效版本:

package main

/*
#cgo CFLAGS: -Isrc/walker
#cgo LDFLAGS: -L${SRCDIR}/lib -lwalker
#include "walker.h"
*/
import (
    "C"
)
func main() {
    errorMessageBuffer := C.CString("")
    pathPtr := C.CString("/src/vali/config")
    bufferLen := C.int(len(4000))

    C.loadConfig(pathPtr, errorMessageBuffer, bufferLen)
}

回溯:

/tmp/go-build056292810/github.com/testong/vali/_obj/main.cgo2.o: In 
function `_cgo_b2bd1c9e3dda_Cfunc_loadConfig':
/tmp/go-build/github.com/testong/vali/_obj/cgo-gcc-prolog:43: undefined 
reference to `loadConfig'
collect2: error: ld returned 1 exit status

最佳答案

walker.h中,导出函数为 void* loadConfig(const char *filePath, char* errorMessageBuffer, int bufferLen);

并且您使用了C.loadConfigDirectory(pathPtr, errorMessageBuffer, bufferLen)

未定义函数 loadConfigDirectory

可能是错别字?

工作版本有效,因为 versionString 已经定义。

关于go - undefined reference to error 仅针对某些函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48372518/

相关文章:

rest - 如何在渲染到 jSON 之前将 Golang 结构的字段修改为另一种类型?

go - 如何将变量(不是结构成员)传递到 text/html 模板中。戈朗

go - 如何制作运行时指定类型的元素数组

cmake - 获取由命令 add_definitions() 和 add_compile_options() 设置的 C/CXX FLAGS

linux - 确定使用哪些选项编译 OpenSSH?

go - 提取数字中特定位置的数字

go - CGO 指针检查中的已知实现错误

go - 在 Go 包中复制数据文件?

Go 代码构建链接器错误。我可以手动链接吗?

c - 哪些规则应该在 GNU make 中使用 CFLAGS