从多个.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
任何时候,我开始一个新的项目,我使用回购作为一个起点。
非常感谢您的支持!我一整天都在瞎搞,没有成功。我开始创建一个bash脚本,所以我至少可以创建一些东西......我应该能够从这里弄清楚它。再次感谢 :) – facetoe 2013-03-02 09:38:38