小编aaa*_*789的帖子

cgo交叉编译错误stdlib.h not found

背景

我将使用 go-sqlite3 交叉编译 golang 应用程序,这将我推入“cgo 交叉编译坑”。为了将其交叉编译为aarch64,我使用的命令如下,但出现错误:

[root@ec5dc2a3bd37 data_collector]# make crosscompiletry
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ AR=aarch64-linux-gnu-ar CGO_LDFLAGS="--sysroot=/usr/include:/usr/lib/gcc/aarch64-linux-gnu/4.8.5/include -static" /usr/local/go/bin/go build -o ./output/crosscompile/dcagent ./cmd/agent/main.go
# runtime/cgo
_cgo_export.c:3:20: fatal error: stdlib.h: No such file or directory
 #include <stdlib.h>
                    ^
compilation terminated.
make: *** [crosscompiletry] Error 2
Run Code Online (Sandbox Code Playgroud)

问题

我该如何修复这个错误?

这是否意味着 gccgo 找不到 aarch64 的包含文件?

我有那些包含和开发工具,包含是由设置的--sysroot,我做对了吗?

在等待帮助的同时我会挖掘以下线索:

  1. 我发现这一步我没有做,这与我的问题有关吗?
  2. 网上搜了也没找到解决办法,最类似的情况就是这个博客,但是如何在centos中安装musl-dev呢?
  3. 找到了一个存储库xcgo,稍后会尝试。

依恋

包含文件

[root@ec5dc2a3bd37 data_collector]# find /usr -regex '.*aarch64.*std.*'
/usr/lib/gcc/aarch64-linux-gnu/4.8.5/include/stdnoreturn.h
/usr/lib/gcc/aarch64-linux-gnu/4.8.5/include/stdarg.h
/usr/lib/gcc/aarch64-linux-gnu/4.8.5/include/stdbool.h
/usr/lib/gcc/aarch64-linux-gnu/4.8.5/include/stdint.h
/usr/lib/gcc/aarch64-linux-gnu/4.8.5/include/stdalign.h
/usr/lib/gcc/aarch64-linux-gnu/4.8.5/include/stddef.h
/usr/lib/gcc/aarch64-linux-gnu/4.8.5/include/stdint-gcc.h …
Run Code Online (Sandbox Code Playgroud)

cross-compiling go

4
推荐指数
1
解决办法
6653
查看次数

gcc 是否将长字符串初始化为 `""` 而不是短字符串?

注意: 我知道读取未初始化的字符串是未定义的行为。这个问题具体是关于 GCC 的实施。

\n

我使用的是 GCC 版本 6.2.1,并且我观察到长度大于 100 左右的未初始化字符串被初始化为"". 读取未初始化的字符串是未定义的行为,因此编译器可以""根据需要随意将其设置为,并且当字符串足够长时,GCC 似乎会这样做。当然,我永远不会在生产代码中依赖这种行为 - 我只是好奇这种行为在 GCC 中来自哪里。如果它不在 GCC 代码中的某个地方,那么它不断发生就是一个非常奇怪的巧合。

\n

如果我写下面的程序

\n
/* string_initialization.c */\n#include <stdio.h>\n\nint main()\n{\n  char short_string[10];\n  char long_string[100];\n  char long_long_string[1000];\n\n  printf("%s\\n", short_string);\n  printf("%s\\n", long_string);\n  printf("%s\\n", long_long_string);\n\n  return(0);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

并用 GCC 编译并运行它,我得到:

\n
$ ./string_initialization\n\xef\xbf\xbdQE\xef\xbf\xbd\n\n\n$\n
Run Code Online (Sandbox Code Playgroud)\n

(有时第一个字符串也是空的)。这表明如果字符串足够长,GCC 会将其初始化为"",但否则并不总是这样做。

\n

如果我用 GCC 编译以下程序并运行它:

\n
#include <stdio.h>\n\nint main()\n{\n  char long_string[100];\n  int i;\n\n  for (i = 0 ; i < 100 ; ++i)\n  {\n    printf("%d …
Run Code Online (Sandbox Code Playgroud)

c gcc undefined-behavior

2
推荐指数
1
解决办法
188
查看次数

标签 统计

c ×1

cross-compiling ×1

gcc ×1

go ×1

undefined-behavior ×1