登录
首页 >  Golang >  Go问答

重新编译静态库为PIE对象时,golang、gcc和C++无法直接使用,需使用-fPIC标志

来源:stackoverflow

时间:2024-03-06 19:27:25 436浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《重新编译静态库为PIE对象时,golang、gcc和C++无法直接使用,需使用-fPIC标志》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

我尝试将现有的 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"

以上就是《重新编译静态库为PIE对象时,golang、gcc和C++无法直接使用,需使用-fPIC标志》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>