使用 make 和 gcc 编译和链接来自不同目录的源代码
Posted
技术标签:
【中文标题】使用 make 和 gcc 编译和链接来自不同目录的源代码【英文标题】:Compile and link sources from different directories with make and gcc 【发布时间】:2015-05-26 09:48:53 【问题描述】:我有一个带有一些子目录的项目。我想为每个目录使用一个 makefile 编译它们,并将所有输出文件链接到一个可执行文件中。谁能解释一下,我应该使用哪些命令(-c 或 -g 或额外调用)?
我的根目录中的makefile:
LIBS =
# The test will be called in this file. There is no need to change this.
#SRCS = main_test.c
SRCS = min.c max.c
###############################################################################
# #
# Normally it is not needed to edited below this. #
# #
###############################################################################
#SRCS = main_test.c Automated.c Basic.c Console.c CUCurses.c CUError.c Cunit_intl.c \
# MyMem.c TestDB.c TestRun.c Util.c wxWidget.c main_test.c \
# $(TST_SRCS)
# define the C object files
#
# This uses Suffix Replacement within a macro:
# $(name:string1=string2)
# For each word in 'name' replace 'string1' with 'string2'
OBJ = $(SRCS:%.c=%.o)
# define the C compiler to use
CC = gcc
# define any compile-time flags
ODIR = out
#compile and link
#CFLAGS = -O0 -g -Wall -fmessage-length=0 -fprofile-arcs -ftest-coverage
#compile without link
CFLAGS = -O0 -c -Wall -fmessage-length=0 -fprofile-arcs -ftest-coverage
#TODO Linkerflags
LFLAGS = --coverage
#VPATH=test
#VPATH=source
# define the executable file,
TARGET = CUnit
export COVERAGE = $(TST_SRCS)
export STUBS = $(STUB_SRCS)
all:
$(MAKE) -C stub
$(MAKE) -C source
@echo --- build finished ---
@echo.
@echo TODO
@echo --- start linking ---
@echo.
和子目录的makefile
# define any directories containing header files other than /usr/include
# TODO
# define any libraries to link into executable:
# if I want to link in libraries (libx.so or libx.a) I use the -llibname
# option, something like (this will link in libmylib.so and libm.so:
LIBS =
# TODO define the C source files
SRCS = $(COVERAGE)
# define the C object files
#
# This uses Suffix Replacement within a macro:
# $(name:string1=string2)
# For each word in 'name' replace 'string1' with 'string2'
OBJ = $(SRCS:%.c=%.o)
# define the C compiler to use
CC = gcc
# define any compile-time flags
ODIR = ../out
#compile without link
CFLAGS = -O0 -c -fmessage-length=0 -fprofile-arcs -ftest-coverage
#TODO Linkerflags
LFLAGS = --coverage
# define the executable file,
all: $(TARGET) $(OBJ)
$(CC) $(OBJ) $(CFLAGS) -o $(TARGET) $(LFLAGS) $(OBJ)
@echo +++ build of source finished +++
clean:
$(RM) *.o *~ $(MAIN)
# DO NOT DELETE THIS LINE -- make depend needs it
如果所有输出文件都在同一个目录中,链接器会更容易。与 ODIR 一起使用吗?
【问题讨论】:
您应该将-C
与子makefile 一起使用,这很容易管理。您还应该为每个源文件设置一个规则,以便管理包含依赖项
如果使用 -c 调用 gcc,则没有输出文件。在这种情况下,链接如何工作?
不是gcc -c
。 make -C
在根目录的生成文件中,我使用“make -C SUBDIRECTORY”这会调用子目录中的生成文件,但不会将模块链接在一起。也许是缺少一些东西。
如果您需要首先编译所有子目录,则无法链接子 makefile 中的对象。您必须在最高的 makefile 中执行此操作。我对您的文件层次结构一无所知,因此无法为您提供更多帮助。
【参考方案1】:
使用编译器选项-c -g
,我可以编译每个子make并将目标文件链接在一起。
CFLAGS = -O0 -Wall -c -g -fmessage-length=0 -fprofile-arcs -ftest-coverage
【讨论】:
以上是关于使用 make 和 gcc 编译和链接来自不同目录的源代码的主要内容,如果未能解决你的问题,请参考以下文章
是否有 GCC 编译器/链接器选项来更改 main 的名称? [复制]
Linux编译器-gcc/g++使用及项目自动化构建工具-make/Makefile
Linux编译器-gcc/g++使用及项目自动化构建工具-make/Makefile
GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结
单击问题窗口时,在Visual Studio代码上找不到文件错误(使用make,gcc和gcc problemMatcher)