Определение BOOST_TEST_DYN_LINK приводит к сбою приложения в Visual Studio.

В документации по модульному тестированию Boost конкретно указано, что вам необходимо определить .html" rel="nofollow noreferrer">BOOST_TEST_DYN_LINK для связи с библиотекой модульных тестов повышения.

Я использую этот базовый пример:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE test_module1

// This header is for the dynamic library, not the header only one
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(test1) {
    BOOST_CHECK(true);
}

Я добавил boost к своим путям include/library, и код компилируется нормально, но когда я компилирую модульные тесты boost с помощью Visual Studio и пытаюсь их запустить, я получаю следующую ошибку:

Приложение не удалось правильно запустить (0xc000003b).

Я чувствую, что мне просто нужно указать, насколько расплывчатым и бесполезным является это сообщение об ошибке...

По какой-то причине, если я удалю строку #define BOOST_TEST_DYN_LINK, код будет скомпилирован и успешно запущен, но это прямо противоречит тому, что говорится в документации по Boost.

Почему это происходит?


Дополнительная информация:

Это то, что я использую:

повысить v1_63_0

введите здесь описание изображения


person tjwrona1992    schedule 25.08.2017    source источник
comment
Не публикуйте ошибки или информацию в виде скриншотов. Разместите их в виде текста. На вашем снимке экрана видно, что вы используете VS14, но пометили VS13. Также не уверен, почему вы упоминаете версию IDE. IDE != компилятор. Упоминание версии MSVC (компилятор C/C++, поставляемый с VS) было бы гораздо полезнее.   -  person tambre    schedule 25.08.2017
comment
ой! Я указал неверную версию. Я исправлю это.   -  person tjwrona1992    schedule 25.08.2017
comment
И версия MSVC 14.0   -  person tjwrona1992    schedule 25.08.2017
comment
Вероятно, вам потребуется предоставить намного больше информации. Какая версия Windows? Microsoft не предоставила C++ для динамической инициализации и уничтожения с Параллелизм (aka Magic Statics) до Windows 10, и для этого требуется Visual Studio 2017. Меньшие версии Windows или Visual Studio будут страдать от необъяснимых проблем с запуском, если вам не повезет. Если говорить из опыта...   -  person jww    schedule 02.02.2018
comment
@jww Я использую Windows 7 Professional SP1 x64   -  person tjwrona1992    schedule 02.02.2018


Ответы (3)


У меня нет проблем с запуском вашего кода. Поэтому я сомневаюсь, что в вашем случае есть проблема со сборкой.

Мой буст построен таким образом (после перехода в исходный каталог Boost):

bootstrap.bat
.\b2.exe toolset=msvc -j 2 --with-test release link=shared stage

Затем вам нужно скопировать библиотеки DLL из stage\lib куда-нибудь по вашему пути и добавить соответствующие каталоги Boost в вашу среду. Для моей среды командной строки у меня есть (при условии, что вы сделали что-то вроде set BOOST_ROOT=C:\src\boost_1_65_1):

set INCLUDE=%BOOST_ROOT%;%INCLUDE%
set LIB=%BOOST_ROOT%\stage\lib;%LIB%

Тогда я смогу без проблем успешно собрать ваш тестовый код:

cl /EHsc /MD test.cpp
.\test.exe
person Yongwei Wu    schedule 02.02.2018
comment
Я сам построил источник повышения, но, возможно, я допустил ошибку по пути. Думаю, я попробую еще раз. - person tjwrona1992; 08.02.2018

Что касается того, почему, это, безусловно, потому, что вы включаете/вводите как статические, так и динамические (dll) варианты в свой код. Это может произойти в MSVC, потому что Boost использует функцию автоматической компоновки компилятора. Я всегда использую BOOST_ALL_NO_LIB , чтобы отключить автоматическое связывание и получить полный контроль над связанными библиотеками.

В частности, библиотеки автоматического связывания, когда они используются, не видны в параметрах связывания, что затрудняет обнаружение проблем.

person Raffi    schedule 14.02.2018

Тогда просто не определяйте BOOST_TEST_DYN_LINK при использовании Visual Studio.

Основной файл нашего модуля содержит только:

#ifndef _MSC_VER
#define BOOST_TEST_DYN_LINK
#endif
#define BOOST_TEST_MAIN
#define BOOST_TEST_MODULE Main
#include <boost/test/unit_test.hpp>

Он отлично работает на Linux с использованием GCC и на Windows с использованием как Visual Studio, так и MinGw.

person kenba    schedule 25.08.2017
comment
Это было решение, которое я планировал использовать, но мне интересно, почему оно не работает. Кажется, я не могу найти причину, задокументированную где-либо, и в документации по ускорению говорится, что для ее работы требуется определение BOOST_TEST_DYN_LINK. - person tjwrona1992; 25.08.2017
comment
Я рад, что решение работает для вас @tjwrona1992. Что касается почему это не работает: я точно не знаю. Я рекомендую вам изменить один из ваших тегов вопроса на boost-test, чтобы найти кого-то, кто действительно знает, почему... - person kenba; 25.08.2017
comment
Спасибо @kenba, я обновил вопрос с новым тегом. - person tjwrona1992; 25.08.2017