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/

ただし、手動で Makefile を作成するのは面倒なので、代わりに cmake を学ぶことを強くお勧めします。

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

http://echochamber.me/viewtopic.php?f=11&t=12301で説明されているように、mrkite の「編集とコンパイル」アプローチを使用します。

それがbashファイルであることを宣言するために上部に魔法の呪文が必要なだけです.gccは、必要なすべてのフラグを指定して呼び出され、現在のファイルから読み取るように設定されます。最後の 1 つの魔法の言葉で、スキャンを停止します。その後、コンパイルされたコードをすぐに実行したり、他のことを行うことができます。

#!/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

@ジョンウェアありがとう!私は最初に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 に答える