golang-org-x-exp 打包遇到 undefined reference 错误

错误日志:

[   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,而头文件没装是不行的

work.h 也是打包进了 mobile 的啊。

#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 给包进去

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 是不是需要更新一下了。

@hillwood 我更新不了,我都有用 golang 重写的 golang-packaging,人家不同意有什么办法:

rewrite with golang itself by marguerite · Pull Request #19 · openSUSE/golang-packaging · GitHub

本主题在最后一个回复创建后60分钟后自动锁定。不再允许添加新回复。