c++ - 创建一个 Makefile 来构建 swigged 模块

标签 c++ makefile swig

我正在尝试创建一个模块,它将 .cpp 和 .swg 文件作为输入并使用 SWIG 创建一个 .so 文件。问题是,我对 makefile 知之甚少,而且我也不太确定我做错了什么。这是我的生成文件:

CXX = g++
SWIG = swig
SWIGFLAGS = -c++ -python 
CXXFLAGS = -c -fpic -Wall #for debugging purposes
LDFLAGS = -shared

file_processor.so: %*.o
    $(CXX) $(LDFLAGS) $^

%.o: %.cxx %.cpp
    $(CXX) $(CXXFLAGS) $? -o $@

%.cxx: %.swg
    $(SWIG) $(SWIGFLAGS) $<

当我运行它时,make 说:

make: *** No rule to make target `%*.o', needed by `file_processor.so'.  Stop.

我究竟做错了什么?谁能建议一种更好的方法来完成我想做的事情?

最佳答案

1)默认规则:

_file_processor.so: %*.o
    ...

正如所写,这需要一个名为“%*.o”的先决条件,Make 既无法找到也无法构建它。我想你的意思是:

_file_processor.so: *.o
    ...

但随后 Make 将拉入所有现有的 .o 文件——如果有任何遗漏也不用担心。我推荐:

OBJS = file_processor.o file_processor_wrap.o

_file_processor.so: $(OBJS)
    ...

2) 对象规则:

%.o: %.cxx %.cpp
    $(CXX) $(CXXFLAGS) $? -o $@

除非两个先决条件都存在,否则这条规则将不适用,这似乎不是您想要的。你必须将它分成两条规则:

%.o: %.cxx
    $(CXX) $(CXXFLAGS) $< -o $@

%.o: %.cpp
    $(CXX) $(CXXFLAGS) $< -o $@

(模式规则与普通规则的工作方式不同。)

3) 小修正:

swig -c++ -python file_processor.swg

您是说 file_processor_wrap.swg 吗?否则流程没有意义,因为您将构建 file_processor.cxx 但永远不会使用它。

关于c++ - 创建一个 Makefile 来构建 swigged 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13577017/

相关文章:

c++ - 资源编译器无法编译 Win32 资源脚本中的枚举语句?

java - 为多目录项目制作文件

java - 将 SWIG 与 C++ 的 std::map 一起使用时,Java 没有迭代器

php - 使用 SWIG 创建 PHP C/C++ 扩展模块

c++ - 为什么没有 C++11 线程安全替代 std::localtime 和 std::gmtime?

c++ - 具有高频信号 <-> 槽连接的 Qt EventLoop 延迟

c++ - async_read 不读取从 telnet 发送的数据

c++ - 自动化 C++ 构建

LINUX GNU 在 Makefile 中创建新用户 Postgres DB

python - 使用 SWIG 将 C++ 文件包装为 Python 文件