如何编译单个文件c ++程序,将输出打印到编译缓冲区,如果编译成功则运行c ++可执行文件,并将c ++可执行文件的输出附加到编译输出。
以下elisp代码可以使用与缓冲区名称相同的名称编译c ++程序。现在如何运行并将exectutable的输出附加到 compile 缓冲区
(defun cpp-single-file-compile ()
(interactive)
(save-buffer)
(compile
(concat "g++ -g " (buffer-file-name) " -o " (file-name-sans-extension (buffer-file-name)))))
(add-hook 'c++-mode-hook (lambda () (local-set-key "\C-c\C-c" 'cpp-single-file-compile)))
答案 0 :(得分:0)
此外,对于您的代码,我在hack-local-variables
命令中有一个C-c C-c
:
(defun compileCompileCommand ()
"Compile current file."
(interactive)
(hack-local-variables)
(unless file-local-variables-alist
(setq compile-command (concat "g++ -g " (buffer-file-name) " -o " (file-name-sans-extension (buffer-file-name))
" && " (file-name-sans-extension (buffer-file-name)) ".exe")))
(compile compile-command))
(add-hook 'c-mode-common-hook '(lambda ()
(local-set-key (kbd "C-c C-c") 'compileCompileCommand)))
然后我将局部变量添加到我的源文件中。例如:
#include <iostream>
int main() {
std::cout << "Test";
return 0;
}
/*
Local Variables:
compile-command: "g++ -g test.cc && ./a.exe"
End:
*/
因此,您可以根据每个文件决定要执行的操作。由于compile-command
事物的原因,hack-local-variables
的更改在下一次编译中被视为。
输出结果为:
-*- mode: compilation; default-directory: "/c/temp/" -*-
Compilation started at Fri Nov 15 15:22:34
g++ -g test.cc && ./a.exe
Test
Compilation finished at Fri Nov 15 15:22:34
编辑:有时需要链接一些额外的库或指定一些额外的包含路径。因此,我无法接受Talespin_Kit作为完整解决方案的答案。我认为在上面编辑的版本中给出的组合更好。如果给出局部变量,则使用原始compile-command
,否则使用自动生成的compile-command
。注意,还可以使用assq
来检查compile-command
是否是局部变量的成员。
答案 1 :(得分:0)
解决方案非常简单。只需在编译后执行
(defun cpp-single-file-compile ()
(interactive)
(save-buffer)
(compile
(concat "g++ -g " (buffer-file-name) " -o " (file-name-sans-extension (buffer-file-name))
" && " (file-name-sans-extension (buffer-file-name)) ".exe")))
(add-hook 'c++-mode-hook (lambda () (local-set-key "\C-c\C-c" 'cpp-single-file-compile)))