使用c库进行构建,遇到了stdlib.h中的重复成员

使用c库进行构建,遇到了stdlib.h中的重复成员,c,go,cgo,C,Go,Cgo,我正在用golang做一些协议栈编程。我将编解码器放在C中,并使用简单的CMake配置构建C,如下所示: cmake_minimum_required (VERSION 2.8) project (Demo1) aux_source_directory(. DIR_SRCS) add_library(codecLib SHARED ${DIR_SRCS}) 并用这种代码链接共享库 //#cgo CFLAGS:-I./codec/ //#cgo LDFLAGS: ./codec/bui

我正在用golang做一些协议栈编程。我将编解码器放在C中,并使用简单的CMake配置构建C,如下所示:

cmake_minimum_required (VERSION 2.8)

project (Demo1)

aux_source_directory(. DIR_SRCS)


add_library(codecLib SHARED ${DIR_SRCS})
并用这种代码链接共享库

//#cgo CFLAGS:-I./codec/

//#cgo LDFLAGS: ./codec/build -lcodecLib

//#include <protocol.h>

import "C"

import "fmt"

我还没有找到解决办法。非常感谢您的解决方案。

您遇到的问题可能是由于GOLang没有正确解析GNU C库中的预处理器命令(或者根本没有解析)。这也可能是由于导入
endian.h
时出现问题,或者需要其他C/GO/CGO导入或定义

以下是
waitstatus.h
()的摘录:


您会注意到,相同的变量会被宣布两次——每个Endian一个。GOLang因此而出错。如果您知道要编译哪个endian,可以通过手动编辑文件来解决此问题。

我遇到了同样的问题。我根本没有使用stdlib。错误仍然存在。预处理是正确的。它将_字节_顺序与ENDIAN进行比较。一个变量不可能同时有两个不同的值谢谢,这有助于我发现我的项目中有一个导致此错误的endian.h头文件。很高兴听到@RaphaelYu。如果答案有帮助,就接受它:)
In file included from /usr/include/stdlib.h:42:0,
from _cgo_export.c:2:
/usr/include/x86_64-linux-gnu/bits/waitstatus.h:79:15: error: duplicate member ‘__w_retcode’
  unsigned int __w_retcode:8;
               ^
/usr/include/x86_64-linux-gnu/bits/waitstatus.h:80:15: error: duplicate member ‘__w_coredump’
  unsigned int __w_coredump:1;
               ^
/usr/include/x86_64-linux-gnu/bits/waitstatus.h:81:15: error: duplicate member ‘__w_termsig’
  unsigned int __w_termsig:7;
               ^
/usr/include/x86_64-linux-gnu/bits/waitstatus.h:93:15: error: duplicate member ‘__w_stopsig’
  unsigned int __w_stopsig:8; /* Stopping signal.  */
               ^
/usr/include/x86_64-linux-gnu/bits/waitstatus.h:94:15: error: duplicate member ‘__w_stopval’
  unsigned int __w_stopval:8; /* W_STOPPED if stopped.  */
# if    __BYTE_ORDER == __LITTLE_ENDIAN 
    unsigned int __w_termsig:7;
    unsigned int __w_coredump:1;
    unsigned int __w_retcode:8;
    unsigned int:16;
# endif /* Little endian. */ 
# if    __BYTE_ORDER == __BIG_ENDIAN 
    unsigned int:16; 
    unsigned int __w_retcode:8; 
    unsigned int __w_coredump:1; 
    unsigned int __w_termsig:7; 
# endif /* Big endian.  */