3

我正在尝试使用 C++,但不得不通过命令行使用冗长的命令运行事情很烦人,所以我想制作一个 bash 脚本来简化流程并运行这些命令

#!/bin/bash
if [ "$1" == "start" ]; then
    cd CCPP
    cd HelloWorld
    g++ -Wall -W -Werror main.cpp -o HelloWorldCPP
    ./HelloWorldCPP

但是我以前从未使用过 bash,并且从其他人的代码中将其破解。它不起作用,但我不知道为什么,因为我不知道。

4

3 回答 3

6

fi最后错过了,但你也可以像这样编写一个 GNU Makefile:

CXX=g++
CXXFLAGS=-Wall
OBJS=main.o
EXECUTABLE=main

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJS)
        $(CXX) $(CXXFLAGS) $(OBJS) -o $@


clean:
        rm -f $(EXECUTABLE)
        rm -f $(OBJS)

main.o: main.cpp

请注意,这是一个灵活的示例,您可以进一步简化它。在这里你可以找到一个非常好的教程来阅读:

http://mrbook.org/tutorials/make/

但是,我强烈建议改为学习 cmake,因为手动编写 Makefile 很痛苦。

CMakeLists.txt 文件可能是这样的:

add_executable(main main.cpp)

然后简单地说:

mkdir -p build && cd build && cmake ../ && make VERBOSE=1

然后您将以跨平台方式完成,因为 GNU Makefiles 仅适用于 Unices。您需要针对 Windows 等进行调整才能使其正常工作。cmake 几乎可以在任何需要的地方免费使用,并且它对原生构建、交叉编译有适当的支持。

这个论坛还有一个 cmake 标签,周围有几个人可以帮助你。

于 2013-08-24T15:19:03.887 回答
4

我使用 mrkite 的“编辑和编译”方法,如http://echochamber.me/viewtopic.php?f=11&t=12301中所述

它只需要顶部的魔法咒语来声明它是一个 bash 文件,然后使用您想要的任何和所有标志调用 gcc 并设置为从当前文件中读取。最后一个魔术词使它停止扫描;之后,您可以立即运行编译后的代码,或执行其他任何操作。

#!/bin/sh
/usr/bin/gcc -xc -o howareyou - <<EVILEOF
#include <stdio.h>
int main()
{
    printf("this is so wrong\n");
}
EVILEOF
./howareyou
于 2013-08-24T15:34:34.287 回答
1

@Jongware 谢谢!我第一次看到bitcoin.c正在使用它,但是您建议的版本在 bash 中使用了 doc-here!伟大的!

我已经改进了一点。现在你可以编译两者

sh program.cpp

g++ program.cpp -o program && ./program

 

#if 0
#set -e
#process substitution
#ls . | cat EQUALS cat <(ls .)
#But this does not always work, so we have to use regular one
( cat <<COLLECTDATAMAGICKEYWORD
#line 9
#endif
#include <iostream>
#define COLLECTDATAMAGICKEYWORD
using namespace std;
int main(int argc, char const *argv[])
{
    cout<<(char*)(void)"Hello World"; //Intentionally throws warning so you can see #line 9 works! 
    return 0;
}
COLLECTDATAMAGICKEYWORD
#if 0
) |\
 sed '2d' |\
 sed '1a \ "'"$(echo "${0}" | sed 's#\\#\\\\\\\\#g')"'"' |\
 sed '1N;s#\n##' |\
 g++ -xc++ -o program3 -
./program3
#endif
于 2013-11-27T02:07:34.790 回答