0

我正在手动编写一个 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 文件的大纲来构建共享库 - 即我希望构建的对象和二进制文件去哪里。

4

2 回答 2

0

wrappers/$(SOURCES)扩展为废话,仅在第一个文件名前加上路径。

于 2012-08-27T11:14:25.200 回答
0

您可以在Makefile以下内容中指定:

SOURCES=wrappers/foo_wrap.cpp wrappers/fo. .... and so on,

然后wrappers/all:

正如您所观察到的,这将在wrappers目录中创建目标文件。为了避免这种情况,请查看gcc/g++ 选项将所有对象文件放入单独的目录中,以解决此问题。

于 2012-08-27T11:54:03.277 回答