我正在使用 cgo 包装一个 C 库并遇到了一组奇怪的链接器错误。我将问题归结为以下几点:
文件 header.h 包含
#ifndef HEADER_H
#define HEADER_H
#define CONSTANT1 ("")
#define CONSTANT2 ""
#define CONSTANT3 ((char*)0)
#define CONSTANT4 (char*)0
#endif /* HEADER_H */
并且 test.go 包含
package main
/*
#include "header.h"
*/
import "C"
func main() {
_ = C.CONSTANT1
_ = C.CONSTANT2
_ = C.CONSTANT3
_ = C.CONSTANT4
}
运行时go run test.go
出现以下错误:
# command-line-arguments
... _cgo_main.o:(.data.rel+0x0): undefined reference to `CONSTANT4'
... _cgo_main.o:(.data.rel+0x8): undefined reference to `CONSTANT3'
... _cgo_main.o:(.data.rel+0x10): undefined reference to `CONSTANT1'
collect2: ld returned 1 exit status
我对此有两个问题:
- 为什么链接器与预定义的常量有任何关系?
- 为什么
CONSTANT1
,CONSTANT3
,CONSTANT4
显示为未定义,但不是CONSTANT2
?
提前致谢。
*编辑:定义为其他值(例如整数)的常量可以正常工作。
*Edit2:使用 go 版本 go1.1.2 linux/amd64
*Edit3:失败的完整示例:
我正在使用 C OpenLDAP 库并希望使用该LDAP_SASL_SIMPLE
常量。它被定义ldap.h
为
#define LDAP_SASL_SIMPLE ((char*)0)
#define LDAP_SASL_NULL ("")
LDAP_SASL_NULL
常数给出了相同的错误。
一个最小的演示 go 程序:
package main
/*
#cgo LDFLAGS: -lldap
#include <ldap.h>
*/
import "C"
func main() {
_ = C.LDAP_SASL_SIMPLE
}