【问题标题】:undefined reference to error only for certain functions仅针对某些功能的未定义错误引用
【发布时间】:2018-06-30 13:10:50
【问题描述】:

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

【问题讨论】:

  • 示例正确吗? C.loadConfigDirectory 定义在哪里?
  • 我修改了walker.h,我打错了对不起

标签: go cgo cflags ldflags


【解决方案1】:

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

而你使用了C.loadConfigDirectory(pathPtr, errorMessageBuffer, bufferLen)

函数loadConfigDirectory没有定义。

可能是笔误?

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

【讨论】:

  • @thylong 能给个实现吗?我怀疑你没有实现loadConfig
猜你喜欢
  • 2020-10-24
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 2020-03-04
  • 2011-12-22
  • 1970-01-01
相关资源
最近更新 更多