undefined仅对某些函数引用错误

时间:2018-01-21 22:49:45

标签: go cgo cflags ldflags

我有一个库和一个为它构建的C接口。 我的程序使用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

1 个答案:

答案 0 :(得分:0)

void* loadConfig(const char *filePath, char* errorMessageBuffer, int bufferLen);中,导出功能是 C.loadConfigDirectory(pathPtr, errorMessageBuffer, bufferLen)

你使用了loadConfigDirectory

未定义函数versionString

也许这是一个错字?

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