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
これについて 2 つの質問があります。
- リンカーが定義済みの定数と関係があるのはなぜですか?
- 、、が未定義として表示されるのに、そうでないの
CONSTANT1
はなぜですか?CONSTANT3
CONSTANT4
CONSTANT2
前もって感謝します。
*編集: 他の値 (int など) として定義された定数は正常に機能します。
*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
}