gpt4 book ai didi

C 常量上的 Cgo 链接器错误

转载 作者:IT王子 更新时间:2023-10-29 01:48:25 27 4
gpt4 key购买 nike

我在使用 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

我有两个问题:

  1. 为什么链接器与预定义常量有任何关系?
  2. 为什么 CONSTANT1CONSTANT3CONSTANT4 显示为未定义,而不是 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 常量给出相同的错误。

一个最小的演示程序:

package main

/*
#cgo LDFLAGS: -lldap

#include <ldap.h>
*/
import "C"

func main() {
_ = C.LDAP_SASL_SIMPLE
}

最佳答案

我最初确实根据我认为 cgo 的工作方式回答了一些不同的问题。但是,如果 CONSTANT2 被 cgo 识别,则可能是某些不同的原因。你能不能:

  • 在库文件上运行工具 nm 并判断输出是否包含 CONSTANT2 或您引用的同时通过以下方式建立的任何其他常量#定义。库可能会在声明全局符号的同时声明一个#define 常量,以解决兼容性问题。

  • 如果可能,请提供您的问题的最小工作示例。这是一个示例,可以由阅读您的帖子并展示您的问题的人编译。你的问题看起来可能会遗漏一些重要的部分来回答它。例如,很高兴知道您遇到问题的实际库。


原始答案

如果您使用#define,您不会建立编译器实际看到的任何内容。 #define 是在解析之前删除的预处理指令。要建立编译器(以及 cgo)可以看到的常量,实际声明它们:

const char *CONSTANT1 = "";
const char *CONSTANT2 = "";
const char *CONSTANT3 = (char*)0;
const char *CONSTANT4 = (char*)0;

如果您无法触摸标题,那么您通常无能为力;您基本上必须复制代码的 Go 部分中的所有常量:

const (
CONSTANT1 = "",
CONSTANT2 = "",
CONSTANT3 = nil,
CONSTANT4 = nil,
)

您可以尝试复杂的技巧,例如在您的 Go 代码上运行 cpp,但这可能会导致比解决问题更多的麻烦。

关于C 常量上的 Cgo 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19126160/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com