2016-05-31 1 views
1

Я пытаюсь скомпилировать полный независимый статический исполняемый файл с MS Visual C++-Express.Компиляция полного статического исполняемого файла в Visual Studio 2010 с помощью библиотеки boost

Я использовать библиотеки Boost, которые также скомпилированные со статическим связыванием:

b2 --toolset=msvc-10.0 --link=static runtime-link=static variant=release threading=multi

В Visual Studio У меня есть следующие настройки:

General: MFC use static library

VC++ Directories -> Include Directory: PATH TO BOOST FILES

C/C++ -> Code Generation: Runtime Library Muthithreaded

C/C++ -> Precompiled Header: Don't use

Linker-> Input: Additional dependencies: FULL PATH TO ALL USED BOOST LIB FILES (C:\boost_1_61_0\stage\lib\libboost_system-vc100-mt-gd-1_61.lib....)

я могу скомпилировать динамически связанные исполняемый, но если я попробую статический исполняемый файл, то я получу эту ошибку:

1>LINK : fatal error LNK1104: cannot open file 'libboost_system-vc100-mt-sgd-1_61.lib'

м?

ответ

1

Свойство не должно начинаться с префиксом --, так что ваша команда сборки должна выглядеть примерно так:

b2 toolset=msvc-10.0 link=static runtime-link=static variant=release threading=multi

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

b2 toolset=msvc-10.0 link=static runtime-link=static variant=debug,release threading=multi

Это создаст две версии каждой библиотеки «libboost_foo-VC100 -mt-s-1_61.lib 'и' libboost_foo-vc100-mt-sgd-1_61.lib '. Версия 's' - это релиз lib, а версия 'sgd' - это debug lib. См. boost docs точно, что означает каждый из этих символов.


EDIT: После того, как раз, глядя на ваши настройки, это выглядит, как вы вручную указали путь ко всем форсирования LIBS, которые вы используете. В дополнение к тому, что я упомянул выше о свойствах сборки, вы должны указать путь поиска библиотеки под VC++ Directories -> Library Directories. В Visual Studio boost укажет, какие библиотеки ему нужны, используя директивы препроцессора #pragma comment(lib, ...). Вы можете отключить это поведение для одной библиотеки, указав BOOST_<lib>_NO_LIB, прежде чем включать его заголовок или для всех библиотек, указав BOOST_ALL_NO_LIB.

+0

Право! Думаю, я сделал это правильно, но написал здесь неправильно. Во всяком случае, я скомпилирую его снова, чтобы быть уверенным. – Ulf

+0

Мое определение preproccesor выглядит, что теперь: WIN32 NDEBUG _CONSOLE BOOST_ALL_NO_LIB #pragma комментарий (Пб "boost_system") #pragma комментарий (Пб "boost_regex") #pragma комментарий (Пб "boost_date_time") #pragma comment (lib, "boost_serialization") #pragma comment (lib, "boost_thread") – Ulf

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