如何使用CMake构建共享库,从这个(不工作的)Makefile示例开始

时间:2012-08-27 11:08:42

标签: php c++ makefile cmake swig

我正在手工编写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文件的大纲来构建共享库,考虑项目的目录结构 - 即我想要构建的对象和二进制文件。

2 个答案:

答案 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答案以解决此问题。