1

所以我有这个问题:我在我的 C 程序中声明了一些外部全局变量。如果我不对 gcc 使用 -c 选项,我会收到未定义的引用错误。但是使用该 -c 选项,链接没有完成,这意味着我没有生成可执行文件。

那么我该如何解决呢?

这是我的makefile(感谢Alex)

CC = gcc                      # compiler/linker frontend
INCL = -I$(INCL_DIR)          # includes
DEFS = -D_DEBUG_              # defines
CFLAGS = -g $(INCL) $(DEFS)   # compiler flags
LFLAGS = -lpthread -lm -g     # linker flags

OBJ = approx.o producteur.o sequentialApproximation.o main.o
BIN = calculPi.exe
LINKOBJ  = approx.o producteur.o sequentialApproximation.o main.o
RM = rm -fv

all: $(BIN)

clean:
 ${RM} *\~ \#*\# $(OBJ)

clean_all: clean
 ${RM} $(BIN)

cleanall: clean
 ${RM} $(BIN)

$(BIN): $(OBJ)
 $(CC) $(LFLAGS) -o $@ $^

main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h

.c.o:
 $(CC) $(CFLAGS) -c $<

这是 make 的输出:http: //pastebin.com/NzsFetrn

我确实在 approx.h(外部和全局)中声明了外部变量,我尝试在 approx.c 中调用它们,但它不起作用。

4

1 回答 1

3

解决方案 1

您不能通过-c链接阶段,因为这会告诉编译器跳过链接。

你的问题是

$(BIN): $(OBJ)
    $(CXX) $(LINKOBJ) -o "calculPi.exe"

CXX_FLAGS =-g -c -lpthread -lm

$(CXX)扩展到哪里gcc -g -c -lpthread -lm ...

摆脱-c那里。

仅在从源模块编译到目标模块时传递 -c。

解决方案 2

关于第二个问题,您实际上并没有在任何地方定义变量。在您的.c文件中,您需要以下行:

Coord* production;
int indice_prod;
int indice_cons;

(假设你真的想要全局变量)。这将修复未解决的外部错误。在它们被分配之前,你不能给它们写信!

笔记

另请注意,您可以在一个规则中指定如何从源构建目标文件:

.c.o:
    $(CC) $(CFLAGS) -c $<

并指定没有规则的依赖项:

main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h

等等

其他注意事项。

此外,作为一般经验法则,CXX应该只包含编译器名称,不包含标志。那些应该进去CXX_FLAGSCXX你为什么不叫它CC?如果g++您想要 C++ 编译器,请使用,或使用CC. 既然你有.c文件,我会假设 C。所以在你的情况下,你应该改变:

CXX_FLAGS =-g -c -lpthread -lm
CXX = gcc $(CXX_FLAGS) $(INCL) $(DEFS)

CC = gcc
CFLAGS = -g -lpthread -lm $(INCL) $(DEFS)  # also removed -c

而且您不需要单独的LINK_CXX.

示例生成文件

所以一个最小的 Makefile 应该是这样的:

# Makefile
CC = gcc                      # compiler/linker frontend
INCL = -I$(INCL_DIR)          # includes
DEFS = -D_DEBUG_              # defines
CFLAGS = -g $(INCL) $(DEFS)   # compiler flags
LFLAGS = -lpthread -lm -g     # linker flags

OBJ = approx.o producteur.o sequentialApproximation.o main.o
BIN = calculPi.exe

all: $(BIN)

$(BIN): $(OBJ)
    $(CC) $(LFLAGS) -o$@ $^

main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h

.c.o:
    $(CC) $(CFLAGS) -c $<

# clean and other stuff.
于 2010-05-08T10:10:05.353 回答