Попытка запустить этот пример STL с помощью std::vector
из документации, но я получаю ошибки компоновщика.
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"
Поскольку я использую Swig для расширения 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)" (?_Atomic_compare_exchange_weak_4@std@@YAHPECKPEAKKW4memory_order@1@2@Z) 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)" (?_Atomic_fetch_sub_4@std@@YAKPECKKW4memory_order@1@@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)" (?_Atomic_load_4@std@@YAKPECKW4memory_order@1@@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)" (?_Atomic_fetch_add_4@std@@YAKPECKKW4memory_order@1@@Z) C:\Users\Allan\Documents\Visual Studio 2013\Projects\swig_std_vector\swig_std_vector\example_wrap.obj swig_std_vector
Я могу сделать более простые расширения PHP, используя SWIG, которые работают нормально, но они не используют STL в исходном коде.
Необходимо определить ZEND_WIN32_FORCE_INLINE
,
Других решений пока нет …