我有一个别名定义来编译一个 opencv 程序,如下所示
alias gcv='g++ -I/usr/local/include/opencv -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_objdetect'
然后我继续输入
gcv imageshow.cpp
我收到一长串错误
但是当我在包含文件和库文件之间的.cpp(源代码)文件中使用别名中指定的相同命令时(按照这里的建议),一切都进行得很顺利。
g++ -I/usr/local/include/opencv imageshow.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui
现在输入长命令,随着复杂性的增加,该命令会变得更大,每次都变得越来越困难,请帮助我使别名起作用或建议任何其他替代方案。
答案1
尝试不使用别名:
g++ imageshow.cpp -o imageshow `pkg-config --cflags --libs opencv`
答案2
为什么不使用简单的脚本来代替别名?
归档gcv
~/bin/
#/bin/sh
g++ $* -I/usr/local/include/opencv -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_objdetect
或者,如果您正在使用,zsh
则可以使用文件中定义的函数.zshrc
:
gcv() {
g++ $* -I/usr/local/include/opencv -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_objdetect;
}
自动编译器和链接器标志
如果您遇到链接器问题,也可以pkg-config
在此处合并:
#/bin/sh
g++ $* `pkg-config --cflags --libs opencv`
文件名中的空格
虽然其他帖子也涉及类似问题存在,处理文件名中的空格并不是一件容易的事,所以我想在这里重述一个优雅的解决方案;具体来说,我发现利用变量IFS
有很大帮助。
因此,进行少量添加,最终得到
#/bin/sh
IFS=$';'
g++ $* `pkg-config --cflags --libs opencv`
也解决了文件名中的空格问题!
答案3
关于创建 shell 脚本的帖子不是很清楚...这是我创建自己的脚本所遵循的简单过程,即使文件名中有空格它也能工作。
这是我所做的
mkdir ~/bin
nano ~/bin/gcv
sudo chmod u+x ~/bin/gcv
在脚本中输入以下内容
#!/bin/bash g++ "$@" `pkg-config --libs --cflags opencv`
export PATH=$PATH:~/bin
- 输入
echo $PATH
并确保您看到~/bin
您获得的输出中列出的内容。 - 输入
alais
如果您看到任何名称的别名,gcv
请使用该命令unalias gcv
,否则您将无法使用gcv
它作为命令来编译代码,可能别名比脚本具有更高的优先级。 - 即使我的文件名中有空格,脚本也不会出现问题。