编译(一种cpp程序)的最佳方法,它有很多参数

时间:2013-03-27 04:04:44

标签: c++ compilation makefile

这些天我正在学习opengl,我正在从命令行编译(我不想使用IDE,因为我已经习惯了VIM)。编译opengl文件可能很麻烦,比如我有一个名为hello.cpp的文件,用于快速编译和运行我必须这样做:

g++ -framework GLUT -framework OpenGL -framework Cocoa hello.cpp & ./a.out

由于我正在学习opengl,我将使用大量不同的文件进行测试,因此我无法一直输入上述命令。我想要的是:

some_command % & ./a.out

some_command最好是一些常用的(如g ++,make),%是文件名。

我认为makefile可能是一个可能的解决方案,所以我继续学习makefile,但它似乎正在为一个特定的名称工作;有methods to pass parameters to makefile,但对我来说似乎太麻烦了(我必须手动输入ARGUMENT =文件名部分)。

另外我认为shell脚本可能是一个很好的解决方案..唯一的后备是我必须自定义shell脚本的名称。

我想知道是否有更好的方法让我快速编译和运行opengl cpp文件

非常感谢。

2 个答案:

答案 0 :(得分:4)

使用Makefile

CC=g++
PARAM=-framework GLUT    \
      -framework OpenGL  \
      -framework Cocoa  #\

hello: hello.cpp
       $(CC) $(PARAM) ${ARGS} hello.cpp -o hello

然后使用make hello; ./hello;

进行编译和运行

您可能想知道${ARGS}是什么。它适用于自定义命令行参数。所以现在你可以做make ARGS="-framework CustomX" hello; ./hello;这样的事情,它会被添加到你在Makefile中的其他g ++选项中。

您可以阅读有关GNU Makefile hereherehere

的更多信息

更新:这是一个小型单行程序,可生成您需要的所有目标。 如果需要,可以将其扩展为脚本,以便对其进行更多控制。

ls *.cpp | perl -ne 'chomp; $n=$_; $n=~s/\.cpp$//; print "$n: $_\n\t\$(CC) \$(PARAM) \${ARGS} $_ -o $n\n";' >> Makefile

除此之外,我通常手工编写目标。 @Emil Sit的解决方案可能会更好,如果你想要一些非常普遍的东西。

答案 1 :(得分:2)

我认为你希望能够做到这样的事情:

make foo

(例如,来自vim),foo根据您使用的源文件而有所不同。

要在make中实现此目的,您需要使用pattern rule

例如:

CXX=g++
CXX_FLAGS=-framework GLUT -framework OpenGL -framework Cocoa

%: %.cpp
    $(CXX) $(CXX_FLAGS) -o $@ $<
    ./$@

这应该允许您运行make hello,它将:

  • 在当前目录中构建名为hello的可执行文件(如果hello.cpp已更改)。
  • 如果您决定编译并且编译成功,则为您运行hello