从多个.c文件生成多个.so和.o文件

时间:2013-03-02 08:02:31

标签: c makefile

我正在尝试将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的经验。我之前只做过非常简单的事情,所以任何帮助都会非常感激。

1 个答案:

答案 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

每当我开始一个新项目时,我都会使用该回购作为起点。