2015-06-29 3 views
3

В моем приложении я включил boost/system/error_code.hpp (boost 1.58), но не хочу ссылаться на boost_system, но вместо этого имеет решение только для заголовка. Я читаю, определяя BOOST_ERROR_CODE_HEADER_ONLY, что должно быть возможно. Но, к сожалению, он работает не так, как ожидалось. Я все еще получаю ошибку компоновщика для boost :: system :: system_category().BOOST_ERROR_CODE_HEADER_ONLY не имеет рекламируемого эффекта

Интересно, должно ли это работать вообще, и если да, то каким образом. Код в заголовке форсирования:

# ifdef BOOST_ERROR_CODE_HEADER_ONLY 
    inline const error_category & system_category() BOOST_SYSTEM_NOEXCEPT; 
    inline const error_category & generic_category() BOOST_SYSTEM_NOEXCEPT; 
#else 
    BOOST_SYSTEM_DECL const error_category & system_category() BOOST_SYSTEM_NOEXCEPT; 
    BOOST_SYSTEM_DECL const error_category & generic_category() BOOST_SYSTEM_NOEXCEPT; 
#endif 

, и, как вы можете видеть, для system_category() не существует тела. Как это может вообще работать без ссылки на lib?

Update:

В то же время я нашел, где определен органом этой декларации (в boost/system/detail/error_code.hpp, который включен в файл boost/system/error_code.hpp Еще не избежать ошибки компоновщика я работаю в.. XCode (LLVM C++ 11) и определили в настройках целевой BOOST_ERROR_CODE_HEADER_ONLY, если это имеет значение.

+1

Я пробовал это раньше и просто сдался, потому что это было более назойливым, чем я заботился. –

+0

, пожалуйста, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve), который неправильно ссылается –

ответ

3

Я получил его на работу после того, как некоторые эксперименты. ключ к успеху здесь будет включать заголовок boost/system/error_code.hpp перед любым другим кодом, включает этот заголовок, а также предварительный процесс или символ, определенный непосредственно перед включением, в файл cpp. Очень важно включить его в файл cpp, а не, например. в предварительно скомпилированном заголовке (stdafx.h, * _prefix.h и т. д.), поскольку он включает в себя код, который работает только в объектном файле. Определение BOOST_ERROR_CODE_HEADER_ONLY на уровне проекта/цели тоже может работать, но поскольку вам нужно всего лишь один раз в вашем проекте/цели, имеет смысл определить, что прямо перед тем, как включить заголовок форсирования в первый раз.

Если вы следуете этому правилу, на вас также не повлияет проблема с дублирующимся символом, которая может возникнуть, если вы включаете один и тот же код system_category() в несколько файлов cpp.

У вас могут возникнуть проблемы при компиляции кода в режиме деблокирования, поскольку компилятор может автоматически удалить включенный код (если он не используется в этом файле cpp). Поэтому лучше отключить оптимизацию. Однако, поскольку вы не хотите этого для своего обычного кода, имеет смысл создать собственный файл cpp только для этого включения и полностью отключить оптимизацию для этого файла. Вот как я наконец закончил.

Смежные вопросы