2016-08-10 6 views
0

Попытка запустить этот пример STL с использованием std::vector из документации, но я получаю ошибки компоновщика.SWIG-PHP/VS2013: ошибки компоновщика

example.h

#include <vector> 
#include <algorithm> 
#include <functional> 
#include <numeric> 
double average(std::vector<int> v) { 
    return std::accumulate(v.begin(),v.end(),0.0)/v.size(); 
} 
std::vector<double> half(const std::vector<double>& v) { 
    std::vector<double> w(v); 
    for (unsigned int i=0; i<w.size(); i++) 
    w[i] /= 2.0; 
    return w; 
} 
void halve_in_place(std::vector<double>& v) { 
    std::transform(v.begin(),v.end(),v.begin(), 
     std::bind2nd(std::divides<double>(),2.0)); 
} 

example.i

%module example 
%{ 
#include "example.h" 
    %} 
    %include "std_vector.i" 
    // Instantiate templates used by example 
    namespace std { 
    %template(IntVector) vector<int>; 
    %template(DoubleVector) vector<double>; 
    } 
// Include the header file with above prototypes 
%include "example.h" 

Так как я использую глотнул для расширения PHP, я бегу swig -php -c++ example.i для создания соответствующей оболочки. Компиляция источники дает

Warning 6 warning C4005: 'inline' : macro redefinition C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xkeycheck.h 203 1 swig_std_vector 
Error 7 error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro. C:\Program Files (x86)\Microsoft Visual Studio 
12.0\VC\include\xkeycheck.h 250 1 swig_std_vector 

Добавление _XKEYCHECK_H в директивах препроцессора открывает больше ошибок:

Error 18 error LNK2001: unresolved external symbol "int __cdecl std::_Atomic_compare_exchange_weak_4(unsigned long volatile *,unsigned long *,unsigned long,enum std::memory_order,enum std::memory_order)" ([email protected]@@[email protected]@[email protected]) C:\Users\Allan\Documents\Visual Studio 2013\Projects\swig_std_vector\swig_std_vector\example_wrap.obj swig_std_vector 
Error 19 error LNK2001: unresolved external symbol "unsigned long __cdecl std::_Atomic_fetch_sub_4(unsigned long volatile *,unsigned long,enum std::memory_order)" ([email protected]@@[email protected]@@Z) C:\Users\Allan\Documents\Visual Studio 2013\Projects\swig_std_vector\swig_std_vector\example_wrap.obj swig_std_vector 
Error 20 error LNK2001: unresolved external symbol "unsigned long __cdecl std::_Atomic_load_4(unsigned long volatile *,enum std::memory_order)" ([email protected]@@[email protected]@@Z) C:\Users\Allan\Documents\Visual Studio 2013\Projects\swig_std_vector\swig_std_vector\example_wrap.obj swig_std_vector 
Error 21 error LNK2001: unresolved external symbol "unsigned long __cdecl std::_Atomic_fetch_add_4(unsigned long volatile *,unsigned long,enum std::memory_order)" ([email protected]@@[email protected]@@Z) C:\Users\Allan\Documents\Visual Studio 2013\Projects\swig_std_vector\swig_std_vector\example_wrap.obj swig_std_vector 

я могу сделать простые расширения PHP с помощью SWIG, которые работают хорошо, но они не делают использование STL в источнике.

ответ

0

Необходимо указать ZEND_WIN32_FORCE_INLINE.