2

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 つの質問があります。

  1. リンカーが定義済みの定数と関係があるのはなぜですか?
  2. 、、が未定義として表示されるのに、そうでないのCONSTANT1はなぜですか?CONSTANT3CONSTANT4CONSTANT2

前もって感謝します。

*編集: 他の値 (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
}
4

1 に答える 1