我正在手工编写Makefile以使用SWIG创建PHP扩展库。我有以下目录结构:
wrappers/ # SWIG generated C++ wrappers and header
objects/ # I want to place my object files here
bin/ # I want to place my executable (shared lib) here
这就是我的Makefile的样子:
CC=g++
CFLAGS=-fPIC -c -Wall
INCLUDES=`php-config --includes` -Iwrappers
LDFLAGS=-shared
SOURCES=foo_wrap.cpp \
foobar_wrap.cpp \
foofoobar_wrap.cpp \
foobarbar_wrap.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=php_foobarlib.so
all: wrappers/$(SOURCES) bin/$(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o objects/$(input)
.cpp.o:
$(CC) $(CFLAGS) $< -o objects/$(input)
clean:
rm -rf *o $(EXECUTABLE)
当我在命令行运行make时,出现以下错误:
make: * 没有规则可以使目标
foobar_wrap.cpp', needed by
全部'。 停止。
我想使用CMake构建共享库。有人可以发布我需要创建的CMakeLists文件的大纲来构建共享库,考虑项目的目录结构 - 即我想要构建的对象和二进制文件。
答案 0 :(得分:0)
wrappers/$(SOURCES)
扩展为无意义,仅为带有路径的第一个文件名添加前缀。
答案 1 :(得分:0)
您可以在Makefile
中指定以下内容:
SOURCES=wrappers/foo_wrap.cpp wrappers/fo. .... and so on,
然后从wrappers/
all:
正如您所观察到的,这将在wrappers
目录中创建目标文件。为避免查看gcc/g++ option to place all object files into separate directory答案以解决此问题。