【发布时间】:2018-03-24 19:00:12
【问题描述】:
我有以下生成文件
# See gcc/clang manual to understand all flags
CFLAGS += -std=c99 # Define which version of the C standard to use
CFLAGS += -Wall # Enable the 'all' set of warnings
CFLAGS += -Werror # Treat all warnings as error
CFLAGS += -Wshadow # Warn when shadowing variables
CFLAGS += -Wextra # Enable additional warnings
CFLAGS += -O2 -D_FORTIFY_SOURCE=2 # Add canary code, i.e. detect buffer overflows
CFLAGS += -fstack-protector-all # Add canary code to detect stack smashing
# We have no libraries to link against except libc, but we want to keep
# the symbols for debugging
LDFLAGS = -rdynamic
# external libs
# par défaut les chemins classiques
LDFLAGS += -I$(HOME)/local/include
LDFLAGS += -L$(HOME)/local/lib
# Default compiler
CC=gcc
# folders
SOURCE_FOLDER=src
TESTS_FOLDER=tests
PAQUET_FOLDER=paquet
SEND_RECEIVE_DATA_FOLDER=sendAndReceiveData
CLIENT_FOLDER=client
SERVER_FOLDER=server
# folder of sources
PAQUET_FULL_PATH=$(SOURCE_FOLDER)/$(PAQUET_FOLDER)
SEND_RECEIVE_DATA_FULL_PATH=$(SOURCE_FOLDER)/$(SEND_RECEIVE_DATA_FOLDER)
CLIENT_FULL_PATH=$(SOURCE_FOLDER)/$(CLIENT_FOLDER)
SERVER_FULL_PATH=$(SOURCE_FOLDER)/$(SERVER_FOLDER)
# sources files
# On prend tout
PACKET_SOURCES = $(wildcard $(PAQUET_FULL_PATH)/*.c)
SEND_RECEIVE_DATA_SOURCES = $(wildcard $(SEND_RECEIVE_DATA_FULL_PATH)/*.c)
CLIENT_SOURCES = $(wildcard $(CLIENT_FULL_PATH)/*.c)
SERVER_SOURCES = $(wildcard $(SERVER_FULL_PATH)/*.c)
# objects
PACKET_OBJECTS=$(PACKET_SOURCES:.c=.o)
SEND_RECEIVE_DATA_OBJECTS=$(SEND_RECEIVE_DATA_SOURCES:.c=.o)
CLIENT_OBJECTS=$(CLIENT_SOURCES:.c=.o)
SERVER_OBJECTS=$(SERVER_SOURCES:.c=.o)
# another things
# Default target
all: clean server client
client: $(CLIENT_OBJECTS) $(PACKET_OBJECTS); \
$(CC) $(CFLAGS) $(CLIENT_OBJECTS) $(LDFLAGS);
server: $(SERVER_OBJECTS) $(PACKET_OBJECTS); \
$(CC) $(CFLAGS) $(SERVER_OBJECTS) $(LDFLAGS);
$(PACKET_OBJECTS): $(PACKET_OBJECTS); \
$(CC) $(CFLAGS) -lz $(PACKET_OBJECT) $(LDFLAGS);
tests: $(PACKET_OBJECTS) $(TESTS_OBJECTS); \
$(CC) $(CFLAGS) -lcunit $(LDFLAGS);
.PHONY: clean
clean:
@rm -f *.o
我收到了这条消息:
make: 循环 src/paquet/packet_implem.o _start': (.text+0x20): undefined reference tomain' collect2: 错误: ld 返回 1 退出状态 Makefile:71: recipe for 目标 'src/paquet/packet_implem.o' 失败 make: *** [src/paquet/packet_implem.o] 错误 1
我想要什么:
1) 构建依赖项 (PACKET_SOURCES) 和 (SEND_RECEIVE_DATA_SOURCES)
2) 使用步骤 1 中的依赖项构建客户端和服务器
3) 可执行的“客户端”将位于文件夹的根目录。
如何纠正我的错误?
【问题讨论】:
-
除非CFLAGS包含参数
g,否则不会有任何调试符号。如果使用gdb调试器,则使用g而不是ggdb -
关于:
CC=gcc1) 使用:=而不是=,因此宏只被评估一次,而不是每次被引用。 2) 对 shell 函数使用宏的想法是准确指定要使用的程序名称的哪个实例。即使用:CC := /usr/bin/gcc -
此语句:“编译”配方中的
LDFLAGS += -I$(HOME)/local/include is something you want at the end of thegcc` 命令。不在link配方中。建议:INCLUDE += -I$(HOME)/local/include -
在
all目标之前,应该有一行:.PHONY : all -
您(通常)不想在尝试构建时运行“干净”目标。所以这一行:
all: clean server client最好写成:all: server client