问题标签 [gccgo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
gcc - 使用 gccgo 构建 Go - fork/exec 没有这样的文件或目录
我正在尝试在 RHEL 6.8 上运行一个简单的 helloworld.go。
GC 编译器工作正常
相反,出于某种原因,我需要使用 gccgo 进行编译,但永远无法编译。更不用说最终静态编译它了。
对问题的见解将不胜感激?
gcc - Go 导入包:用 go (-compiler gccgo) 找到 pkg,用 gccgo 找不到
Go/gccgo 版本:6.3.0
我正在构建一个程序go build -compiler gccgo -x <args> <args> program.go
。构建过程失败
logging.go
进口
如果我logging.go
用 独立编译go build
,它编译得很好:
如果我/usr/bin/gccgo
独立运行命令,错误仍然存在。
我曾经strace
跟踪
% strace -f -o aa /usr/bin/gccgo <args> logging.go (args same with above)
并发现
open("/opt/gopath/src/github.com/op/go-logging", O_RDONLY) = 10
open("/opt/gopath/src/github.com/op/go-logging.gox", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/opt/gopath/src/github.com/op/libgo-logging.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/opt/gopath/src/github.com/op/libgo-logging.a", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/opt/gopath/src/github.com/op/go-logging.o", O_RDONLY) = -1 ENOENT (No such file or directory)
编译器能够go-logging
在我的 $GOPATH 中找到包,但由于没有看到任何文件.gox
.so
.a
或.o
文件而失败。
这与 Go 网站上的内容一致:
知道如何解决这个问题吗?
谢谢。
gcc - go install 生成二进制文件失败
这个问题有两个方面:
1) Go install 无法生成二进制文件
程序来源:https://github.com/hyperledger/fabric
工作目录:/opt/gopath/src/github.com/hyperledger/fabric
构建的主程序:/opt/gopath/src/github.com/hyperledger/fabric/peer/main.go
构建命令:
我希望内置二进制文件,/opt/gopath/bin
但那里什么都没有。
它在控制台上显示一系列 .a 文件已构建并移至/opt/gopath/pkg/linux_amd64/
最终程序停止并且没有构建二进制文件。无论 CGO_ENABLED 设置为 0 还是 1,这都是正确的。
不知何故,程序认为它完成了,没有链接目标文件和构建二进制文件?我可以使用其他任何调试措施来进一步研究它吗?
2) 'Go install' 命令取自 Makefile
该'Go install'
命令在 docker 容器中运行,该容器的启动方式与 Makefile 指定的方式相同。唯一的区别是我是手动完成的,分两次,即启动 docker container + go install。如果我用 Makefile 一次性构建它,它会工作得很好。
'docker run <image> go install <args>'
使用这种风格命令有什么注意事项吗?
c - 如何调试用 cgo 调用的 C 代码?
背景
我目前正在为这个库编写一个 Go 接口。
作为第一步,我试图/test/test_pc.c
通过 Go 包装器调用它们来运行测试。重要的是要注意,当由 GCC 编译时,测试是成功的。
重要的附加细节:值得一提的是,目前我已经拥有了我想要在上面运行的所有 C 代码import "C"
。原因是relic_test.h
不提供函数原型,因此 cgo 无法通过调用来识别函数,例如C.foo()
. 因此,我把所有的test_pc.c
代码都放在了下面的格式中:
问题
当我尝试从 go 中运行它们时,在一个特定的测试中执行会“卡住”(即代码正在执行中,但它只是简单地没有转到下一条指令)。如何找出代码卡住的原因?如何观察程序的执行流程?
我试过的东西
同样,如果我尝试直接使用 C(即,如果我用 GCC 编译并运行它),代码就可以工作。因此,GDB 也将起作用。我也尝试过使用go tools cgo -debug-gcc
,但这只会打印预处理指令。go tools cgo -gccgo
不输出任何东西。最后,Go 调试器 Delve 无法调试 C 调用。
go - 构建 gccgo 得到链接器错误
根据此处的说明,我正在构建 gccgo 。但是,我这样做后收到错误消息:
错误:
/opt/gold/bin/ld:错误:找不到-lugin
/opt/gold/bin/ld:错误:找不到-lugin-opt=/home/objdir/./gcc/lto-wrapper
/opt/gold/ bin/ld: 错误: 找不到 -lugin-opt=-fresolution=/tmp/cc9M7ZGm.res
这是我使用的源代码:
操作系统:ubuntu 14.04/x86_64
binutils: http: //ftp.gnu.org/gnu/binutils/binutils-2.29.tar.xz
gccgo 代码分支:https ://github.com/gcc-mirror/gcc/tree/gccgo
有什么我错过的吗?
更新--with-ld==/opt/gold/bin/ld
:在为 gccgo make 运行配置时删除该选项后,它对我有用。似乎这是与黄金有关的问题。
c - 如何从 Go 函数返回 C 指针?
我有疑问是否可以从 C 上的 Go 函数指针返回?例如 main.c 可以是:
接下来是 Go 代码:
在cgo
命令之后go build -buildmode=c-archive test.go
,我收到头文件并尝试通过命令将其链接到我的 c 项目中gcc -g -pthread main.c test.a -o main
,所有编译和链接都成功但在运行时我收到下一个错误:panic: runtime error: cgo result has Go pointer
想法是在 c 中接收指向 DB 的指针,做一些工作,当 DB 不需要时关闭D B。
go - gccgo 的并发问题
我刚刚进入了 GO 领域,所以,像往常一样,我正在尝试用新语言实现一些经典来做一些比较。
我在使用并发的 Montecarlo Simulation for PI 时遇到了一个奇怪的情况:
- 当我使用 编译代码时
gc
,对于任意数量的事件值 (nevents
),我提供了所有 goroutines 同时启动并且所有工作都按预期工作(即使“并发不是并行性”,我知道) - 当我使用 编译代码时,它在小于或等于 ~10.000.000
gccgo
时像上面一样工作,但是对于更大的值,每个 goroutine 在前一个几乎完成时开始,并且这种行为越明显越大(~100.000.000 )nevents
nvalues
我错过了什么?很好,这是我使用 Go 的第一周!
这是代码:
我添加了一个时间延迟以方便调试。
go - 将 GOlang 结构的内容复制到 C 结构
我想将 GOLang 结构的内容复制到 C 结构。在这里,我希望将填充的 GO 结构(类型测试结构)复制到 C 结构 test_c。
已经提出以下逻辑。我已经在 go 文件中访问了 C 结构test_c ,作为C.test_c,并尝试使用 C.GoString 将测试结构的内容复制到 C.test_c (p_c),但是当我尝试这样做时,我得到了这个错误
谁能让我知道正在做的错误是什么,有没有更好的方法来实现同样的错误?
下面是代码,
go_stucture.go
包主
cmain.c
cmain.h
c - 如何在没有定义 main() 的情况下让 cgo 构建目标文件?
我有一个完全用 C 编写的项目。我只需要调用一个必须在 GO 中编码的函数。因此,我使用 cgo 构建 C 文件,然后我想使用生成的目标文件与我的主 C 项目链接。
假设我有一个foo.go
具有单个功能的文件func HelloWorld()
。我希望从我的 C 代码中执行这个函数。
所以我做了以下步骤
现在我有两个文件:
但是,main()
在那里以某种方式定义,我无法将这些目标文件与我的主项目(多个主项目)链接起来。
如何让 cgo 不放入虚拟主目录?还是我这样做完全错了?
编辑我需要入口点在 C 中。其他人发布的建议要求入口点在 GO 中。感谢我信任的另一个用户,我在下面发布了正确的解决方案。
windows - Windows上的cgo:加载的dll的命名
我正在尝试使用gorocksdb,它是一个 cgo 包,用于在 windows 上使用rocksdb 库。
- 我用 vcpkg 构建了rocksdb库,它给了我作为输出rocksdb-shared.dll。我将构建路径设置为我的 PATH。
- 我安装了 msys64 以获得 gcc
- 我已经设置
CGO_CFLAGS="-I/path/to/rocksdb/include"
和CGO_LDFLAGS="-L/path/to/rocksdb -lrocksdb -lstdc++ -lm -lz -lbz2 -lsnappy -llz4 -lzstd"
- 我已将Rocksdb-shared.dll 重命名为librocksdb.dll ,因为链接器需要 dll 以开头
lib
- 我执行
go get ...
命令 - 我运行我的测试 go 文件,我得到了错误
The programer can't start because rocksdb-shared.dll is missing ...
- 如果我将其重命名为rocksdb-shared.dll,则构建失败,因为链接器找不到librocksdb.dll
- 使其工作的唯一方法是在 PATH 中同时拥有rocksdb-shared.dll和librocksdb.dll
为什么可执行文件不断加载rocksdb-shared.dll?我在 cgo 包中没有找到对它的任何引用。