2016-09-17 17 views
1

-mフラグをg ++に追加すると、file format not recognized; treating as linker scriptが発生し、リンク時に構文エラーが発生します。g ++に-Mフラグを追加すると、エラーが再検出されないファイル形式が発生する

私はこのメイクファイルを使用しています:src/src

# Compilers 
CXX = g++ 
#CXX = clang++ 
CC = gcc 

UNAME := $(shell uname) 

# Directories used for input and output 
SRCDIR = src/src 
BUILDDIR = build 
EXEDIR = bin 
INCLUDEDIR = src/include 
VERBOSE = 0 

# Debug flags 
ifeq ($(VERBOSE), 1) 
    CXX_FLAGS += -M 
endif 

# Enable all warnings but format and unused variables 
CXX_FLAGS += -Wall -Wno-format -Wno-unused-variable -Wno-varargs -c -g -O0 -fbuiltin -fpermissive -std=c++14 -I include -I $(INCLUDEDIR) 

OUTPUT_NAME = Test 

# Where the sources are located 
SRCS = $(wildcard $(SRCDIR)/*.cpp) 
SRCS += $(wildcard $(SRCDIR)/*/*.cpp) 

CSRCS = $(wildcard $(SRCDIR)/*.c) 

# Where the compiled objects are located 
OBJS = $(patsubst $(SRCDIR)/%.cpp, $(BUILDDIR)/%.o, $(SRCS)) 
COBJS = $(patsubst $(SRCDIR)/%.c, $(BUILDDIR)/%.o, $(CSRCS)) 

# Linking all the .o files and with the libs 
build: $(OBJS) $(COBJS) 
    $(CXX) $^ $(LINKER_FLAGS) -o ./bin/$(OUTPUT_NAME) 

# Compiling all the .cpp files into .o files 
$(OBJS): $(BUILDDIR)/%.o : $(SRCDIR)/%.cpp 
    $(CXX) $(CXX_FLAGS) -o "[email protected]" "$<" 

$(COBJS): $(BUILDDIRT)/%.o : $(SRCDIR)/%.c 
    $(CC) $(CC_FLAGS) -o "[email protected]" "$<" 

# Running the created exe 
.PHONY: run 
run: 
    ./$(EXEDIR)/$(OUTPUT_NAME) 

は、私は2つのファイル、test.cppfoo.cppを持っています。

test.cpp

#include "foo.h" 
#include "cstdio" 

int main(int argc, char* argv[]) { 
    Foo f; 
    int b = f.bar(2); 

    printf("%d", b); 
    return 0; 
} 

foo.cpp

#include "foo.h" 

Foo::Foo() { 

} 

Foo::~Foo() { 

} 

int Foo::bar(int c) { 
    return c + c; 
} 

foo.cppため.hファイルがsrc/includeである:

foo.h

私は

/usr/bin/ls:build/foo.o: file format not recognized; treating as linker script

usr/bin/ld:build/foo.o:1: syntax error

を取得 make buildを呼び出す

は、コードの罰金をコンパイルし、私は4、期待する出力を得るしかし、(G用-Mフラグをオン++)make VERBOSE=1 buildを呼び出すことで、

私は-Mがプログラムの依存関係を出力すると考えていたので、なぜ-Mフラグを有効にするのがこれを引き起こすのか混乱しています。誰かが正しい方向に私を指すことができたら、私は本当にそれを感謝します。

答えて

2

-Mフラグは、バリーが解答で説明したように、それ以外の場合はオブジェクトファイルを置くはずの場所に、コンパイラ出力の依存関係をに出力します。依存関係は画面に表示されません。さらに、C/C++コンパイルを完全に無効にします。前処理のみが実行されます。

あなたがmakeのための入力として、依存ファイルを生成する-Mオプションを使用していた場合は、オブジェクトファイルと一緒に.dファイルへのコンパイラ出力の依存関係を作るために-MDオプションを使用することができます。 (あなたのケースでは、例えば、それはそれは、オブジェクトファイルfoo.oと一緒にfoo.dファイルを生成するだろう。)

をあなただけの画面に依存関係を印刷するように聞こえるので、しかし、あなたは-MFを使用することができます依存関係の出力をリダイレクトするオプション。

-M -MF /dev/stdout 
+0

これはうまくいきました。ありがとうございます:) – hdt80

2

もちろん、もちろんです! -Mは、gccの出力をオブジェクトファイルからmakeがインポートできるルールファイルに変更するのは間違いありません。しかし、あなたはこれらの結果ファイルではなく、依存ファイルとして-include dをメイクファイルに使用していますが、オブジェクトファイルとして使用しています。要するに

は、あなたがこのような何かをやっている:作品

g++ -c foo.cxx -o foo.o 
g++ -c bar.cxx -o bar.o 
g++ -o exe foo.o bar.o 

を。あなたはそれらの操作foo.obar.oの結果を命名している

g++ -M -c foo.cxx -o foo.o 
g++ -M -c bar.cxx -o bar.o 
g++ -o exe foo.o bar.o 

が、彼らはオブジェクトファイルいない、とあなたがそれらを一緒にリンクしようとすると、リンカはので失敗します..:そして、それを変更します彼らはオブジェクトファイルではありません。 cat "詳細な"ビルドオブジェクトファイルを試してみて、実際にどのように見えるかは非常に明確です。

関連する問題