1

Makefile を実行したときに発生するこのエラーについて、助けていただければ幸いです。私が持っているコードは、別のファイルに分割する前にうまくコンパイルされていました。

メイン関数と「color.h」が含まれているmain.cファイルがあります。その他のファイルは color.h と color.c です。color.c には color.h も含まれています。これは私の最初の Makefile であり、それに関する多くのスレッドやトピックを読んだので、間違っている場合は修正してください。

これはメイクファイルです

CC = g++

CPPFLAGS = `pkg-config opencv --cflags`
LDFLAGS = `pkg-config opencv --libs`

ARCH = -arch x86_64

DEPENDENCIES = main.o color.o

# FINAL OUTPUTS
main: $(DEPENDENCIES)
    $(CC) $(ARCH) $(LDFLAGS) -o $(DEPENDENCIES) 

# MODULES
main.o: main.c color.h
    $(CC) $(ARCH) $(CPPFLAGS) -c main.c

colorOps.o: color.c
    $(CC) $(ARCH) $(CPPFLAGS) -c colorOps.c


# CLEAN
clean:
    -rm main $(DEPENDENCIES)

これは私が得るエラーです

Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [main] Error 1

Mac OS X 10.8.4 で Macports 経由でインストールされた OpenCv を実行しています。前述のとおり、ファイルを分離するまではすべて正常に機能していました。

どうもありがとうございました!

4

1 に答える 1

1

あなたはほとんどそれを正しく持っています:

出力ファイル名 (プログラム名) をリンク ステップに追加するだけです。

main: $(DEPENDENCIES)
    $(CC) $(ARCH) $(LDFLAGS) -o $@ $(DEPENDENCIES) 
#                            ^^^^^

へへへへへへへへへへへ コマンドライン出力を見ていれば、次のように表示されることがわかります。

 gcc -arch x86_64 /opencv-ld-flags/ -o main.o color.o

したがって、それが行っているのは、意図した場所main.oの内容に出力しようとcolor.oすることだけです:

 gcc -arch x86_64 /opencv-ld-flags/ -o main main.o color.o

$@ は、ビルド ルール ステートメントのコロン (:) の左側にあるターゲット ファイル (この場合はメイン) に評価されます。

よりクリーンなメイクファイル

CC = g++

# CPPFLAGS are different from CFLAGS 
# keep CPPFLAGS name only for pre-processing flags 

CFLAGS = `pkg-config opencv --cflags`
LDFLAGS = `pkg-config opencv --libs`

ARCH = -arch x86_64

# DEPENDENCIES is a slightly confusing name
# You will see how I generate dependencies below
# So I replaced DEPENDENCIES with OBJ

SRC=main.c color.c
OBJ=$(SRC:.c=.o)

# INCLUDES flags should be of the form -Idir/path etc.
# Reason for separating this out is to help with 
# generating dependencies below

CPPFLAGS=
INCLUDES=

TARGET=main

default: $(TARGET)

$(TARGET): $(OBJ)
         $(CC) $(LDFLAGS) -o $@ $(OBJ) 

%.o: %.c
    $(CC)  $(CPPFLAGS) $(CFLAGS) $(INCLUDES) -c $< -o $@ 

# CLEAN
clean:
    -rm main $(OBJ)


# Create a rule to generate dependencies information for the makefile

.deps: $(SRC)
     $(CC) -o .deps $(CPPFLAGS) $(INCLUDES) -M -E $(SRC) 

#include dependencies
include .deps
于 2013-06-30T17:46:07.790 に答える