我已经在Ubuntu 20.0.4上编译并构建了一个c++程序(使用SDL2,以防万一),但是当我试图运行它时,它只是打印"无效参数"。如果我尝试通过gdb运行它,它也会打印"无效参数"。然后"在启动过程中,程序以代码126退出;(这是在到达main
的断点设置之前)
我尝试过的事情:
- 确认文件上设置了执行位。
- 添加了-no-pie链接器标志,这使得它构建一个普通的ELF可执行文件,而不是一个可重定位的(见这里)。
readelf
和file
现在都同意它是可执行文件。file
现在打印:
ELF 64位LSB可执行文件,x86-64,版本1 (SYSV),动态链接,interpreter/lib64/ld-linux-x86-64.so。2、builddid [sha1]=432e038be2c1180ec019b585ffbca182a80f6c55,适用于GNU/Linux 3.2.0,带debug_info,不剥离
- 检查与
ldd
的库依赖关系。列出了几十个库,但似乎都成功找到了。 - 尝试通过
sudo
执行它,以防它是一些奇怪的所有权/权限问题。
我的Makefile非常简单,但它最终完成了整个编译&用这条命令链接进程:
gcc -no-pie -o Build/soda src/*.cpp src/editline/complete.c src/editline/editline.c src/editline/sysunix.c src/MiniScript/*.cpp src/compiledData/*.c -Isrc -Isrc/editline -Isrc/MiniScript -Isrc/compiledData -lstdc++ -lm -lSDL2_image -lSDL2
我可以看到这里没有什么有趣的,除了我上面提到的-no-pie
(没有它,我得到相同的结果,但file
看到它是一个共享库)。
我没主意了。谷歌搜索"无效参数"不是很好地工作,但我发现的一些相关的点击表明,这是一个通用的错误消息,任何失败执行文件:错误的架构,错误的文件类型,等等。但由于我只是在这台机器上构建它,因此很难看出这些如何适用。
我还能做些什么来确定导致失败的原因?
我终于找到了答案。我在一个Parallels共享文件夹中工作,即来自主机操作系统(在本例中为macOS)的文件夹,该文件夹已作为驱动器挂载在Linux文件系统(Parallels虚拟机)中。
显然,从这样一个共享文件夹中运行任何可执行文件根本不起作用。将相同的可执行文件复制到我的Linux主目录,并从那里运行它,效果很好。相反,如果我在我的Linux目录(它工作得很好)中构建一个程序,然后将其复制到共享文件夹并尝试从那里运行它,我会得到无效参数"错误。
非常感谢所有试图帮助我的人,我希望下一个遇到这个问题的可怜的笨蛋能找到这个问题。