#c #visual-studio-2010 #boost #log4cxx #stdcall
#c #visual-studio-2010 #повышение #log4cxx #stdcall
Вопрос:
Я буду очень рад, если вы поможете.
Моя среда разработки — VS2010.
Я использую boost 1.47.0, особенно boost::asio.
После нескольких дней разработки я решил добавить log4cxx.
log4cxx необходимо изменить соглашение о вызовах на __stdcall
Я неожиданно получил много ошибок компиляции. Это ~ 70 ошибок.
Я немного погуглил и нашел эти:
#define BOOST_BIND_ENABLE_STDCALL
#define BOOST_MEM_FN_ENABLE_STDCALL
Это помогает. Теперь есть только ~ 10 ошибок.
Здесь есть:
1>ClCompile:
1> main.cpp
1>D:Developmentlibboost_1_47_0boost/detail/interlocked.hpp(61): error C2373: '_InterlockedCompareExchange' : redefinition; different type modifiers
1> C:Program FilesMicrosoft Visual Studio 10.0VCincludeintrin.h(214) : see declaration of '_InterlockedCompareExchange'
1>D:Developmentlibboost_1_47_0boost/detail/interlocked.hpp(62): error C2373: '_InterlockedExchange' : redefinition; different type modifiers
1> C:Program FilesMicrosoft Visual Studio 10.0VCincludeintrin.h(192) : see declaration of '_InterlockedExchange'
1>D:Developmentlibboost_1_47_0boost/detail/interlocked.hpp(63): error C2373: '_InterlockedExchangeAdd' : redefinition; different type modifiers
1> C:Program FilesMicrosoft Visual Studio 10.0VCincludeintrin.h(204) : see declaration of '_InterlockedExchangeAdd'
1>D:Developmentlibboost_1_47_0boost/smart_ptr/detail/sp_counted_base_w32.hpp(92): error C2446: '==' : no conversion from 'long' to 'long (__stdcall *)(volatile long *,long,long)'
1> Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>D:Developmentlibboost_1_47_0boost/smart_ptr/detail/sp_counted_base_w32.hpp(92): error C2040: '==' : 'long (__stdcall *)(volatile long *,long,long)' differs in levels of indirection from 'long'
1>D:Developmentlibboost_1_47_0boost/smart_ptr/detail/sp_counted_base_w32.hpp(92): error C3861: '_InterlockedCompareExchange': identifier not found
1>D:Developmentlibboost_1_47_0boost/smart_ptr/detail/spinlock_w32.hpp(62): error C3861: '_InterlockedExchange': identifier not found
1>D:Developmentlibboost_1_47_0boost/smart_ptr/detail/spinlock_w32.hpp(62): error C2440: 'initializing' : cannot convert from 'long (__stdcall *)(volatile long *,long)' to 'long'
1> There is no context in which this conversion is possible
1>D:Developmentlibboost_1_47_0boost/asio/detail/impl/signal_set_service.ipp(74): error C2664: 'signal' : cannot convert parameter 2 from 'void (__stdcall *)(int)' to 'void (__cdecl *)(int)'
1> None of the functions with this name in scope match the target type
1>D:Developmentlibboost_1_47_0boost/asio/detail/impl/signal_set_service.ipp(246): error C2664: 'signal' : cannot convert parameter 2 from 'void (__stdcall *)(int)' to 'void (__cdecl *)(int)'
1> None of the functions with this name in scope match the target type
1>main.cpp(20): warning C4007: 'main' : must be '__cdecl'
Как я могу их решить?
Есть небольшие идеи или подсказки?
Комментарии:
1. пожалуйста, опубликуйте код, который вы пытаетесь скомпилировать
2. @SamMiller У меня слишком много кода, чтобы опубликовать его. И, как вы можете видеть, я не могу знать, где в моем коде находятся эти ошибки.
3. добро пожаловать в отладку! Это поможет нам помочь вам, если вы сможете свести проблему к короткому, автономному, правильному примеру.
Ответ №1:
Вам также нужно
- #define BOOST_USE_WINDOWS_H
- и, возможно, /Gz (__stdcall)
Комментарии:
1. Хорошая находка, для меня это было связано с тем, что я использовал
/Gz
ваше предложение, которое выявило несовместимость с/clr:pure
тем, где я тогда понял, что я изменил/clr
в своейRelease
конфигурации, но не сделал то же самое для своейDebug
версии.
Ответ №2:
Если ваш код выглядит примерно так:
#include "log4cxx/logger.h"
#include "log4cxx/basicconfigurator.h"
#include "log4cxx/helpers/exception.h"
using namespace log4cxx;
using namespace log4cxx::helpers;
int main()
{
//stuff
}
и вы компилируете с -llog4cxx
then, у вас все должно быть в порядке.