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

问题描述:

我在尝试将program转换为使用插件,并且在Makefile中遇到了一些问题。我希望Makefile在目录插件中查找,将所有在那里找到的带有两个不同扩展名.so和.o的.c文件编译成一个单独的文件夹。基本上与此相同:从多个.c文件生成多个.so和.o文件

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可言了丰富的经验。我只做过非常简单的,所以任何帮助将不胜感激。

这里是什么让你开始:

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 [email protected] which depends on $^" 

%.o: $(SRCS) 
    @echo [email protected] 

%.so: $(SRCS) 
    @echo [email protected] 

首先,这里使用了$(通配符)函数来收集在src/plugins目录中所有的* .c名称。

其次,它使用一个目标,它取决于所有的.o文件和.so文件。

第三种有两种模式规则可以从.c文件中构建.so和.o文件。

你的第四个源代码使用$(TOP)src/plugins,但是你正在建立$(TOP),所以这不是正确的相对路径...你只是想要src/plugins。

所以,当你运行该做的输出(假设/名为src /插件文件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

任何时候,我开始一个新的项目,我使用回购作为一个起点。

+0

非常感谢您的支持!我一整天都在瞎搞,没有成功。我开始创建一个bash脚本,所以我至少可以创建一些东西......我应该能够从这里弄清楚它。再次感谢 :) – facetoe 2013-03-02 09:38:38