Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SWIG文件更改后如何重建项目?_Python_C++_Makefile_Visual Studio 2015_Swig - Fatal编程技术网

Python SWIG文件更改后如何重建项目?

Python SWIG文件更改后如何重建项目?,python,c++,makefile,visual-studio-2015,swig,Python,C++,Makefile,Visual Studio 2015,Swig,给定以下生成文件: TARGET = _example.pyd OFILES = example.obj example_wrap.obj HFILES = CC = cl CXX = cl LINK = link CPPFLAGS = -DNDEBUG -DUNICODE -DWIN32 -I. -Id:\virtual_envs\py351\include CFLAGS = -nologo -Zm200 -Zc:wchar_t- -FS -Zc:strictStrings -O2 -MD

给定以下生成文件:

TARGET = _example.pyd
OFILES = example.obj example_wrap.obj
HFILES =

CC = cl
CXX = cl
LINK = link
CPPFLAGS = -DNDEBUG -DUNICODE -DWIN32 -I. -Id:\virtual_envs\py351\include
CFLAGS = -nologo -Zm200 -Zc:wchar_t- -FS -Zc:strictStrings -O2 -MD -W3 -w44456 -w44457 -w44458
CXXFLAGS = -nologo -Zm200 -Zc:wchar_t- -FS -Zc:strictStrings -D_HAS_EXCEPTIONS=0 -O2 -MD -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577
LFLAGS = /LIBPATH:. /NOLOGO /DYNAMICBASE /NXCOMPAT /DLL /MANIFEST /MANIFESTFILE:$(TARGET).manifest /SUBSYSTEM:WINDOWS /INCREMENTAL:NO
LIBS = /LIBPATH:d:\virtual_envs\py351\libs python35.lib
.SUFFIXES: .c .cpp .cc .cxx .C


{.}.cpp{}.obj::
    $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
    $<
<<

{.}.cc{}.obj::
    $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
    $<
<<

{.}.cxx{}.obj::
    $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
    $<
<<

{.}.C{}.obj::
    $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
    $<
<<

{.}.c{}.obj::
    $(CC) -c $(CFLAGS) $(CPPFLAGS) -Fo @<<
    $<
<<

all: $(TARGET)

$(OFILES): $(HFILES)

$(TARGET): $(OFILES)
    $(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
      $(OFILES) $(LIBS)
<<
    mt -nologo -manifest $(TARGET).manifest -outputresource:$(TARGET);2

install: $(TARGET)
    @if not exist d:\virtual_envs\py351\Lib\site-packages mkdir d:\virtual_envs\py351\Lib\site-packages
    copy /y $(TARGET) d:\virtual_envs\py351\Lib\site-packages\$(TARGET)

clean:
    -del $(TARGET)
    -del *.obj
    -del *.exp
    -del *.lib
    -del $(TARGET).manifest

test:
    python runme.py
.i.cpp:
    swig -python -c++ $<
TARGET=\u example.pyd
OFILES=example.obj example\u wrap.obj
HFILES=
CC=cl
CXX=cl
链接=链接
CPPFLAGS=-DNDEBUG-DUNICODE-DWIN32-I.-Id:\virtual\u envs\py351\include
CFLAGS=-nologo-Zm200-Zc:wchar_t--FS-Zc:strictStrings-O2-MD-W3-w44456-w44457-w44458
CXXFLAGS=-nologo-Zm200-Zc:wchar_t--FS-Zc:strictStrings-D_有异常=0-O2-MD-W3-w34100-w34189-w44996-w44456-w44457-w44458-wd4577
LFLAGS=/LIBPATH:/NOLOGO/DYNAMICBASE/NXCOMPAT/DLL/MANIFEST/MANIFESTFILE:$(目标)。MANIFEST/SUBSYSTEM:WINDOWS/INCREMENTAL:NO
LIBS=/LIBPATH:d:\virtual\u envs\py351\LIBS python35.lib
.后缀:.c.cpp.cc.cxx.c
{.}.cpp{}.obj::

$(CXX)-c$(cxflags)$(CPPFLAGS)-Fo@我已经使用CMake解决了这个问题,这直接转化为使用
autoconf
automake
来生成文件

我们的想法是引入以下变量

DEPENDENCIES = `swig -M -python -c++ -I. example.i | sed 's/\//g'`

让你的目标依赖于此。上面生成了SWIG接口文件可能包含的所有标题和
.i
文件的依赖项列表。

从任何类型的源生成任何类型的目标,这是生成文件的本质:

TARGET = _example.pyd
OFILES = example.obj example_wrap.obj
HFILES =

CC = cl
CXX = cl
LINK = link
CPPFLAGS = -DNDEBUG -DUNICODE -DWIN32 -I. -Id:\virtual_envs\py351\include
CFLAGS = -nologo -Zm200 -Zc:wchar_t- -FS -Zc:strictStrings -O2 -MD -W3 -w44456 -w44457 -w44458
CXXFLAGS = -nologo -Zm200 -Zc:wchar_t- -FS -Zc:strictStrings -D_HAS_EXCEPTIONS=0 -O2 -MD -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577
LFLAGS = /LIBPATH:. /NOLOGO /DYNAMICBASE /NXCOMPAT /DLL /MANIFEST /MANIFESTFILE:$(TARGET).manifest /SUBSYSTEM:WINDOWS /INCREMENTAL:NO
LIBS = /LIBPATH:d:\virtual_envs\py351\libs python35.lib
.SUFFIXES: .c .cpp .cc .cxx .C


{.}.cpp{}.obj::
    $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
    $<
<<

{.}.cc{}.obj::
    $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
    $<
<<

{.}.cxx{}.obj::
    $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
    $<
<<

{.}.C{}.obj::
    $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -Fo @<<
    $<
<<

{.}.c{}.obj::
    $(CC) -c $(CFLAGS) $(CPPFLAGS) -Fo @<<
    $<
<<

all: $(TARGET)

$(OFILES): $(HFILES)

$(TARGET): $(OFILES)
    $(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
      $(OFILES) $(LIBS)
<<
    mt -nologo -manifest $(TARGET).manifest -outputresource:$(TARGET);2

install: $(TARGET)
    @if not exist d:\virtual_envs\py351\Lib\site-packages mkdir d:\virtual_envs\py351\Lib\site-packages
    copy /y $(TARGET) d:\virtual_envs\py351\Lib\site-packages\$(TARGET)

clean:
    -del $(TARGET)
    -del *.obj
    -del *.exp
    -del *.lib
    -del $(TARGET).manifest

test:
    python runme.py
.i.cpp:
    swig -python -c++ $<
  • 不要仅仅依赖推理规则,而是为要生成的每个
    .cpp
    都有一个明确的规则(顺便说一句,CMake就是这样做的)

    • 这要求自动生成Makefile的相关部分。那部分可以是
      !INCLUDE
      'd,但是在
      nmake
      开始处理结果之前,仍然需要外部代码来进行生成。示例代码(同样,在Python中):

      导入操作系统、操作系统路径、子流程
      对于os.listdir('.')中的f,如果os.path.isfile(f)和f.endswith('.i'):
      打印“%s”:“%s”%%(os.path.splitext(f)[0]+'.cxx',f)
      #引号允许使用特殊字符,
      #看https://msdn.microsoft.com/en-us/library/956d3677.aspx
      #命令是不需要的,它将从我给出的推断规则中添加
      #开始时,请参见http://www.darkblue.ch/programming/Namke.pdf,第41页(567)
      

  • 您的语法是一个批处理规则:在该规则中,命令只会被调用一次并提供给所有源。而我的将分别为每个源调用('cuz I dunno if
    swig
    可以在一次调用中处理多个文件)。请参阅以获取说明。@BPL我设法为
    nmake
    的缺陷制定了解决办法。他们需要通过外部逻辑来运行它,但是,根据我们的判断,这正是它的设计者的想法。