我正在尝试使用flymake在Emacs中实现C++代码的语法高亮显示。我知道对于C++的标准flymake配置,它将尝试运行make syntax-check,然而,我的构建系统没有使用Makefile (或者至少不是直接使用)。它使用了rosmake,这是一个用于ROS系统的cmake的包装器。
为了避免我无法控制Makefile的事实,我一直在尝试添加一个基于flymake website和this stackoverflow question的自定义flymake检查器。
我已经创建了命令g++ -Wall -Wextra -fsyntax-only -Iinclude_dir file_to_check.cpp。当我在bash中运行该命令时,我得到了预期的输出。在没有语法错误的情况下,我有一个退出代码0,并且没有输出。对于语法错误,我有一个退出代码1,并按行列出错误。然而,每当我尝试用flymake运行它时,我都会得到一个CFGERR,并被告知flymake已被禁用。
我非常确定正确的命令正在运行,因为该错误显示了完整的命令,并且所有内容看起来都与我在终端中键入的内容相同。我将日志级别一直调到3,以便查看问题所在。日志执行到一半时出现错误
file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp, init=flymake-cc-init [3 times]
create-temp-inplace: file=/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp temp=/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster_flymake.cpp
saved buffer Broadcaster.cpp in file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster_flymake.cpp
started process 14517, command=(g++ -Wall -Wextra -fsyntax-only -std=c++0x  -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/msg_gen/cpp/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/srv_gen/cpp/include -I/opt/ros/fuerte/include
 Broadcaster_flymake.cpp), dir=/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/
received 40 byte(s) of output from process 14517
file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp, init=flymake-cc-init
parsed 'g++: error: : No such file or directory', no line-err-info
file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp, init=flymake-cc-init
process 14517 exited with code 1
cleaning up using flymake-simple-cleanup
deleted file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster_flymake.cpp
Broadcaster.cpp: 0 error(s), 0 warning(s), 0 info in 0.07 second(s)
switched OFF Flymake mode for buffer Broadcaster.cpp due to fatal status CFGERR, warning Configuration error has occured while running (g++ -Wall -Wextra -fsyntax-only -std=c++0x  -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/msg_gen/cpp/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/srv_gen/cpp/include -I/opt/ros/fuerte/include
 Broadcaster_flymake.cpp)主要错误似乎是parsed 'g++: error: : No such file or directory', no line-err-info。我认为这可能是因为Broadcaster_flymake.cpp从未被创建,但我检查了一下,它似乎正在工作。无论是否存在语法错误,我都会得到这些错误。我不明白为什么它找不到文件,因为将命令复制并粘贴到Bash中可以很好地工作。我还在缓冲区中尝试了(shell-command "g++"),以确保emacs能够找到g++二进制文件。
如果你知道为什么flymake不能运行这个命令,请告诉我。谢谢。
发布于 2013-04-02 13:18:28
我知道问题出在哪里了。我重载了函数flymake-get-project-include-dirs。在该函数中,我运行rospack cflags-only-I命令来获取当前ROS包所需的包含目录。我没有意识到的是,在我处理完rospack命令的输出之后,最终的include目录在末尾包含了一个换行符。当我看到它试图在缓冲区中运行的命令时,我注意到它试图检查的文件名总是在新行上,但我认为这只是一个格式化问题。
现在,我已经从include目录中删除了所有换行符,一切都运行得很好。
https://stackoverflow.com/questions/15747457
复制相似问题