错误日志:
[ 82s] # golang.org/x/mobile/gl
[ 82s] /usr/lib64/gcc/x86_64-suse-linux/8/../../../../x86_64-suse-linux/bin/ld: $WORK/b112/_x002.o: in function `process':
[ 82s] ../contrib/src/golang.org/x/mobile/gl/work.go:34: undefined reference to `processFn'
[ 82s] /usr/lib64/gcc/x86_64-suse-linux/8/../../../../x86_64-suse-linux/bin/ld: ../contrib/src/golang.org/x/mobile/gl/work.go:36: undefined reference to `processFn'
[ 82s] /usr/lib64/gcc/x86_64-suse-linux/8/../../../../x86_64-suse-linux/bin/ld: ../contrib/src/golang.org/x/mobile/gl/work.go:39: undefined reference to `processFn'
[ 82s] collect2: error: ld returned 1 exit status
但实际上定义 processFn 的库文件和 work.go 在同一个目录,怎么会找不到呢????同一个目录下的库文化不需要单独指定路径啊?
https://build.opensuse.org/build/home:hillwood:branches:X11:Deepin:Go/openSUSE_Tumbleweed/x86_64/golang-org-x-exp/_log
mobile 里面有 C 函数,也有头文件 work.h。正常是需要编译一个 .a 装到系统上的,但是 golang-packaging 那伙人就是不让我编译和安装 .a,他们写的东西就只是把 work.go 当成 go source 给装上了。
你在编译 exp 的时候,会先编译这个 mobile 的 gl,再编译 exp。要全是 go 文件那自然没什么问题,但是这里需要编译 C,而头文件没装是不行的
#cgo linux LDFLAGS: -lGLESv2
那就在这里补充下 work.h 的 path 看看?
加了 -L/usr/share/go/1.11/contrib/src/golang.org/x/mobile/gl/ 还是报错。
@hillwood
[ 65s] + echo 'Copying deps to /home/abuild/rpmbuild/BUILD/contrib'
[ 65s] Copying deps to /home/abuild/rpmbuild/BUILD/contrib
[ 65s] ++ get_gocontrib_path
[ 65s] +++ rpm --eval '%{_datadir}'
[ 65s] +++ rpm --eval %go_api_ver
[ 65s] ++ echo /usr/share/go/1.11/contrib
[ 65s] ++ get_buildcontrib_path
[ 65s] ++ echo /home/abuild/rpmbuild/BUILD/contrib
[ 65s] + cp -rT /usr/share/go/1.11/contrib/src /home/abuild/rpmbuild/BUILD/contrib/src
看日志的这里。
它是把 /usr/share/go/1.11/contrib/src 里的东西全部复制到 /home/abuild/rpmbuild/BUILD/contrib/src 里,然后在后者编译的。我感觉跟这里有关系。把
-L/usr/share/go/1.11/contrib/src/golang.org/x/mobile/gl/
改成
-L. -lwork
试试看呢?
不行,这样改连 golang-org-x-mobile 都编译失败。
我感觉不是 work.h 没被读取,如果我把 Mesa-libGLESv3-devel 从 golang-org-x-exp 的 spec 里面注释掉,work.h 里面的错误提示“install on Ubuntu with: sudo apt-get install libegl1-mesa-dev libgles2-mesa-dev libx11-dev”是会显示出来的。
@hillwood
[ 58s] cd /usr/lib64/go/1.11/src/net
[ 58s] TERM='dumb' gcc -I . -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b073=/tmp/go-build -gno-record-gcc-switches -o $WORK/b073/_cgo_.o $WORK/b073/_cgo_main.o $WORK/b073/_x001.o $WORK/b073/_x002.o $WORK/b073/_x003.o $WORK/b073/_x004.o $WORK/b073/_x005.o -g -O2
[ 58s] # golang.org/x/mobile/gl
[ 58s] /usr/lib64/gcc/x86_64-suse-linux/8/../../../../x86_64-suse-linux/bin/ld: $WORK/b112/_x002.o: in function `process':
[ 58s] ../contrib/src/golang.org/x/mobile/gl/work.go:34: undefined reference to `processFn'
[ 58s] /usr/lib64/gcc/x86_64-suse-linux/8/../../../../x86_64-suse-linux/bin/ld: ../contrib/src/golang.org/x/mobile/gl/work.go:36: undefined reference to `processFn'
[ 58s] /usr/lib64/gcc/x86_64-suse-linux/8/../../../../x86_64-suse-linux/bin/ld: ../contrib/src/golang.org/x/mobile/gl/work.go:39: undefined reference to `processFn'
[ 58s] collect2: error: ld returned 1 exit status
我把 work.go 里的 CFLAGS 和 LDFLAGS 都补齐了,编译依然出错。
然后我就反应过来了,work.go 编译出来的是 _x002.o,它已经编译出来了,是在 /usr/lib64/go/1.11/src/net 编译 net 这步出的链接错误,应该在 net 里面处理。不过看起来 net 好像是 go1.11 自带的?
最好的办法还是在打包 mobile 的时候直接把静态编译的 gl.a 给包进去
hillwood
(hillwood)
10
golang-org-x-net ? devel:languages:go 里面已经很久没更新了,也被他们从 TW 里面 drop 掉了。难道是这个包太旧的原因?
我 fork 了你的包,mobile 我做了改动,现在 exp编译不报 undefined 那个错误了,最新的报错我还没来得及看
@hillwood
我修好了,不用 LDFLAGS 这些补丁,原因是:
%goinstall
%gosrc
+install -m 0644 %{_builddir}/go/src/%{import_path}/gl/work.c %{buildroot}%{go_contribsrcdir}/%{import_path}/gl/
%gofilelist
golang-packaging 装了 work.h work.go 没装 work.c,函数的真正定义在 work.c 里面
golang-packaging 是不是需要更新一下了。
system
(system)
关闭
15
本主题在最后一个回复创建后60分钟后自动锁定。不再允许添加新回复。