Golang启用.exe文件无法正常运行
简述
在公司写代码遇到的一个坑,我需要与下位机提供的.exe文件进行交互。此时需要我在golang中启用这个.exe文件,然后进行通信。但是当我在使用:
path := "D:/Project/utils/"
cmd := exec.Command(path + "xxx.exe")
if err := cmd.Start(); err != nil {fmt.Errorf("the error is: %w", err)return
}
进行调用时,使用powershell的 tasklist 指令可以看到 xxx.exe 进程已经被启用,但是我的通信服务并不能接通。
问题解决
这里其实会涉及到的问题是关于工作目录的,由于下位机的cpp程序在打包后,依旧会依赖其目录中的一些 .h/.cpp 文件。所以我们如果在编码的工程目录下进行调用时,.exe 文件会找不到其对应的依赖 .h/.cpp。所以,我们需要先切换工程目录到.exe所在的目录下去,但是由于我们是在当前目录编码,所以在完成启动后,还需要返回到当前工程目录来:
// 记录初始目录
oldDir,_ := os.Getwd()// 切换工程目录
if err := os.Chdir(D:/Project/ExeFile); err != nil {fmt.Errorf("the error is: %w", err)return
}// 这里调用 .exe
// 由于已经切换了工程目录,直接调用即可
path := "./xxx.exe"
if err := exec.Command(path); err != nil {fmt.Errorf("the error is: %w", err)return
}// 切回初始工程目录
if err := os.Chdir(oldDir); err != nil {fmt.Errorf("the error is: %w", err)return
}