gpt4 book ai didi

c++ - golang gcc c++ 现有的静态库在制作PIE对象时不能使用;使用 -fPIC 重新编译

转载 作者:行者123 更新时间:2023-12-02 01:35:19 25 4
gpt4 key购买 nike

我尝试将现有的 C++ 库链接到 go 代码。 C++库只有静态库和头文件,没有源代码。

我使用 swigc 生成了 libfoo.go,并编写了一个简单的 libb.go 来构建这个库。这在之前使用 gcc-6 的 ubuntu 16.04 上运行良好。

但是,一旦我升级到 ubuntu 18,即使使用以前可以工作的旧版 go1.9 和 gcc-6,我也会遇到以下错误:

/usr/bin/ld: ./lib/libfoo.a(parser.o): relocation R_X86_64_32S against symbol `xmlSAX2IgnorableWhitespace' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: ./lib/libfoo.a(tree.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE object; recompile with -fPIC

我已将 go 编译器和 gcc 降级到以前可以工作的版本。

以下是曾经可以工作的libb.go

/*
#cgo CXXFLAGS: -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0 -w
#cgo CFLAGS: -I${SRCDIR}/include -w
#cgo LDFLAGS: -Wl -rpath,./lib, -L${SRCDIR}/lib -l:libfoo.a -l:libxml2.a
*/
import "C"

我应该怎么做才能解决这个问题?我搜索了一下,似乎我必须重新编译该静态库,这对我来说是不可能完成的任务。我尝试将 -no-pie 参数传递给 LDFLAGS,但这也不起作用。

最佳答案

我这几天也遇到这个问题了。最后,我发现添加以下行

"env CGO_LDFLAGS=-no-pie"

使用 go build 命令行可以解决这个问题。例如,

"env CGO_LDFLAGS=-no-pie go build -o main main.go"

关于c++ - golang gcc c++ 现有的静态库在制作PIE对象时不能使用;使用 -fPIC 重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56825218/

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