Golang在FreeBSD上使用robotgo时遇到的错误解决

Golang在FreeBSD上使用robotgo时遇到的错误解决 我知道robotgo是为Linux和Mac OS构建的,但我认为FreeBSD应该相当类似。

我相信我已经安装了所有必要的库,但它们位于/usr/local/include目录下,而不是/usr/include。我的意思是,我已经在/usr/local/include目录下的头文件中,针对编译器报错的几个符号进行了grep搜索,并在那里找到了它们。

当尝试在我的系统上构建那个简单的鼠标示例时,最终遇到了未定义的符号,例如:

ld: error: undefined symbol: XCloseDisplay
>>> referenced by xdisplay_c.h:13 (/home/w/go/pkg/mod/github.com/go-vgo/robotgo@v0.110.6/screen/../base/xdisplay_c.h:13)
>>>               /tmp/go-link-2600121927/000002.o:(XCloseMainDisplay)
>>> referenced by xdisplay_c.h:13 (/home/w/go/pkg/mod/github.com/go-vgo/robotgo@v0.110.6/screen/../base/xdisplay_c.h:13)
>>>               /tmp/go-link-2600121927/000002.o:(XGetMainDisplay)
>>> referenced by screen_c.h:48 (/home/w/go/pkg/mod/github.com/go-vgo/robotgo@v0.110.6/screen/screen_c.h:48)
>>>               /tmp/go-link-2600121927/000002.o:(sys_scale)
>>> referenced 28 more times

我尝试导出环境变量,看看是否有帮助,但没有变化:

export CGO_LDFLAGS=-L/usr/local/include

任何帮助都将不胜感激。


更多关于Golang在FreeBSD上使用robotgo时遇到的错误解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

这个错误看起来是加载器在抱怨它无法在某个对象库中找到外部函数,而不是编译器在抱怨它无法在某个头文件中找到该函数的导入。

也许目标文件在 /usr/local/lib 目录下? 所以你可能需要设置 CGO_LDFLAGS=-L/usr/local/lib

更多关于Golang在FreeBSD上使用robotgo时遇到的错误解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好的,第二次运行确实包含了“-L/usr/local/lib”(在很长的 /usr/bin/cc 命令行的末尾),所以你成功地改变了它的查找位置。但它仍然没有找到!

我查看了 robotgo 项目,似乎其他人也有构建问题;他们似乎在使用项目所有者的流程,该流程涉及 go build(并对环境和命令行标志进行了大量调整)。你的构建工具最终归结于此吗?

我对这个项目的细节了解不够,无法提供进一步的帮助。我看到你已经在 github 上提出了一个问题,这应该能行。你可以尝试添加一个日志,记录你的构建工具生成的完整命令行,并说明你在哪里找到了实际的 X11 目标文件。

在FreeBSD上使用robotgo时遇到链接错误,是因为系统库路径配置问题。FreeBSD将X11库安装在/usr/local/lib目录下,而robotgo默认查找的是标准路径。以下是解决方案:

首先,需要正确设置CGO编译标志来指定库路径:

// 在构建前设置环境变量
package main

import (
    "github.com/go-vgo/robotgo"
    "os"
    "os/exec"
)

func main() {
    // 设置编译环境变量
    os.Setenv("CGO_LDFLAGS", "-L/usr/local/lib -lX11 -lXtst -lXinerama -lXfixes")
    os.Setenv("CGO_CFLAGS", "-I/usr/local/include")
    
    // 或者通过命令行构建
    cmd := exec.Command("go", "build", "-ldflags", 
        "-extldflags '-L/usr/local/lib -lX11 -lXtst -lXinerama -lXfixes'")
    cmd.Run()
}

更推荐的方式是在构建时直接指定链接参数。创建一个构建脚本build.sh

#!/bin/sh
export CGO_LDFLAGS="-L/usr/local/lib -lX11 -lXtst -lXinerama -lXfixes"
export CGO_CFLAGS="-I/usr/local/include"
go build -o myapp main.go

或者使用go build命令时直接传递参数:

CGO_LDFLAGS="-L/usr/local/lib -lX11 -lXtst -lXinerama -lXfixes" \
CGO_CFLAGS="-I/usr/local/include" \
go build main.go

如果问题仍然存在,可以创建一个包装robotgo的本地构建配置。在项目根目录创建robotgo_freebsd.go文件:

// +build freebsd

package main

/*
#cgo freebsd LDFLAGS: -L/usr/local/lib -lX11 -lXtst -lXinerama -lXfixes
#cgo freebsd CFLAGS: -I/usr/local/include
*/
import "C"

import _ "github.com/go-vgo/robotgo"

确保已安装必要的FreeBSD包:

pkg install libX11 libXtst libXinerama libXfixes
pkg install xorgproto

对于持续集成或Docker环境,可以在Dockerfile中配置:

FROM freebsd/latest
RUN pkg install -y libX11 libXtst libXinerama libXfixes xorgproto go
ENV CGO_LDFLAGS="-L/usr/local/lib -lX11 -lXtst -lXinerama -lXfixes"
ENV CGO_CFLAGS="-I/usr/local/include"
WORKDIR /app
COPY . .
RUN go build -o app .

如果使用Makefile,可以这样配置:

.PHONY: build

build:
    CGO_LDFLAGS="-L/usr/local/lib -lX11 -lXtst -lXinerama -lXfixes" \
    CGO_CFLAGS="-I/usr/local/include" \
    go build -v ./...

freebsd-build:
    GOOS=freebsd GOARCH=amd64 \
    CGO_LDFLAGS="-L/usr/local/lib -lX11 -lXtst -lXinerama -lXfixes" \
    CGO_CFLAGS="-I/usr/local/include" \
    go build -o bin/freebsd-app main.go

验证库是否在正确路径:

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    // 检查库文件是否存在
    cmd := exec.Command("ls", "-la", "/usr/local/lib/libX11*")
    output, _ := cmd.Output()
    fmt.Printf("X11库文件:\n%s\n", output)
    
    // 检查头文件
    cmd = exec.Command("ls", "-la", "/usr/local/include/X11/Xlib.h")
    output, _ = cmd.Output()
    fmt.Printf("X11头文件:\n%s\n", output)
}

这些配置应该能解决FreeBSD上robotgo的链接问题。关键是要正确指定X11库在FreeBSD上的安装路径/usr/local/lib

回到顶部