我正在尝试将program转换为使用插件,而我在使用Makefile时遇到了一些麻烦。我希望Makefile查看目录插件,编译所有带有两个不同扩展名.so和.o的.c文件,最好是单独的文件夹。基本上与此相同:
gcc -shared -lc -o testPugin.so testPugin.o
gcc -c -fpic testPugin.c
gcc Cprogram.c -ldl
但对于不确定数量的.c文件。
到目前为止,我已经设法查看插件目录并查找所有文件,但我仍然坚持根据上面的第二步编译它们并输出.so和.o文件。以下是我到目前为止的情况:
TOP := $(dir $(lastword $(CURDIR)))
PLUGDIR = $(TOP)src/plugins
PLUGSRC = $(PLUGDIR)/*.c
OBJ = $(PLUGSRC:.c=.o)
SRCS = Cprogram.c
CFLAGS = -shared -lc
BINARY = testProg
$(BINARY): $(SRCS)
echo $(OBJ)
但这只是输出:
⇒ make
echo /Users/fragmachine/eclipse-workspace/Cprogram/src/plugins/*.o
/Users/fragmachine/eclipse-workspace/Cprogram/src/plugins/*.o
如果我将OBJ = $(PLUGSRC:.c=.o)
更改为OBJ = $(SRCS:.c=.o)
,我会:
⇒ make
echo Cprogram.o
Cprogram.o
这是我想要的,但它只适用于一个文件。我想我必须错过某种通配符,但我尝试使用%和*而没有运气。
如果我不清楚我想要做什么,这里有一些奇怪的伪伪代码:
$(BINARY): $(SRCS)
gcc -shared -lc $(All plugin.c files) -o $(OBJ) #Output .o files for each plugin.c file
gcc -shared -lc $(All plugin.c files) -o $(OBJ2) #Output .so files for each plugin.c file
gcc -c -fpic $(All plugin.c files) # I'm not 100% sure what this does
gcc Cprogram.c -ldl # Compile the main program
我根本没有make
的经验。我之前只做过非常简单的事情,所以任何帮助都会非常感激。
答案 0 :(得分:1)
这是让你入门的东西:
PLUGDIR = src/plugins
PLUGSRC = $(PLUGDIR)/*.c
SRCS = $(wildcard $(PLUGSRC))
OBJ = $(SRCS:.c=.o)
SOBJ = $(SRCS:.c=.so)
CFLAGS = -shared -lc
BINARY = testProg
all: $(BINARY)
@echo "make is fun!"
$(BINARY): $(OBJ) $(SOBJ)
@echo "build the binary $@ which depends on $^"
%.o: $(SRCS)
@echo $@
%.so: $(SRCS)
@echo $@
首先,它使用$(通配符)函数来收集src / plugins目录中的所有* .c名称。
其次,它使用一个所有依赖于所有.o文件和.so文件的目标。
第三,有两种模式规则可以从.c文件构建.so和.o文件。
第四个你的源路径使用$(TOP)src / plugins,但你在$(TOP)中构建,所以这不是正确的相对路径...你只需要src / plugins。
所以当你运行这个make时输出是(假设有一个名为src / plugins / Cprogram.c的文件):
$ make
src/plugins/Cprogram.o
src/plugins/Cprogram.so
build the binary testProg which depends on src/plugins/Cprogram.o src/plugins/Cprogram.so
make is fun!
希望你可以从中找到其余部分。
有关详情,请参阅我的项目模板: https://github.com/cdesjardins/makefiles
每当我开始一个新项目时,我都会使用该回购作为起点。