2013-03-02 2 views
1

Я пытаюсь преобразовать мой program для использования плагинов, и у меня возникают проблемы с Makefile. Я хочу, чтобы Makefile выглядел в плагинах каталога, компилировал все файлы .c, найденные там, с двумя разными расширениями .so и .o, желательно в отдельную папку. В основном то же самое:Создайте несколько файлов .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

Вот что-то, чтобы вы начали:

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] 

Во-первых, это использует функцию $ (подстановочные), чтобы собрать все * .c имена в каталоге SRC/плагинов.

Во-вторых, это использует цель, которая зависит от всех файлов .o и .so.

В-третьих, существует два правила шаблона для создания .so и .o-файла из файла .c.

В-четвертых, ваш путь к источнику используется $ (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

Смежные вопросы