C++ code in Org-mode

1 C++

This is a simple example with one c++ file, all in one src code block.

#include <iostream>

int main()
{
    std::cout << "Hello World++! 2.9";
}

The src block looks like:

    #+HEADERS: :tangle hello.c++ :exports code :eval never
    #+BEGIN_SRC C++
    // source code
    #+END_SRC

The HEADERS block is on a separate line because when the buffer is evaluated, code will get run, and the SRC blocks will get rewritten, as well as the RESULTS blocks. Since we want the headers to be preserved, we can’t make them part of the SRC block.

You can also tangle a Makefile.

clean:
    -rm hello

hello:  hello.c++
    clang++ hello.c++ -o hello

With the org mode headers exporting the code, and not evaluating this block. Just like the C++ code. We’ll evaluate the makefile, and run the program, a bit further down.

    #+HEADERS: :tangle Makefile :exports code :eval never
    #+BEGIN_SRC makefile
    # Makefile
    #+END_SRC

Now, we tangle the code out to the files.

    #+NAME: tangle-buffer
    #+HEADERS: :exports both :results value
    #+BEGIN_SRC emacs-lisp
    (org-babel-tangle)
    #+END_SRC
(org-babel-tangle)

That will write out two files when the buffer is evaluated using org-babel-execute-buffer, bound to \C-c \C-v b.

Give this block a name, so that where the results go can be controlled. Do that by giving the RESULTS block the name of the SRC block. Org will then produce a table of the results of executing the elisp, which is the two files produced.

And put the results here:

hello.c++ Makefile

Next, we run make with the target to compile the code. You could also simply write the compiler command here.

    #+NAME: make-clean-hello
    #+BEGIN_SRC sh :exports both :results output
    make clean
    make hello
    #+END_SRC
make clean
make hello

And make will run our compilation as spec’d in the Makefile we just tangled out.

rm hello
Makefile:2: recipe for target 'clean' failed
clang++ hello.c++ -o hello

And now get the output by running the program.

    #+NAME: run-hello
    #+BEGIN_SRC sh :exports results
    ./hello
    #+END_SRC

Which prints out our hello, world text. Which is has version number to convince myself it gets updated.

Hello World++! 2.9

2 Raw Document

Org mode in org is a little tricky, since to show the examples, you have to quote them.

Original document is available on GitHub

Leave a Reply

Your email address will not be published. Required fields are marked *