我有一个库和一个为它构建的 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/