Как мне разрешить ошибку LNK1104 с помощью библиотеки файловой системы Boost в MSCV?
У меня возникли проблемы с подключением моего проекта к файлу libost файловой системы Boost (версия 1.37.0) в Microsoft Visual С++ 2008 Express Edition. Библиотека файловой системы not библиотека только для заголовков. Я следил за Руководство для начинающих в Windows, размещенном на официальной веб-странице повышения. Вот шаги, которые я предпринял:
-
Я использовал bjam для создания полного набора файлов lib, используя:
bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete
-
Я скопировал каталог /libs (расположенный в C:\Program Files\boost\build-boost\boost\bin.v2) до C:\Program Files\boost\boost_1_37_0\libs.
-
В Visual С++ в разделе Проект > Свойствa > Дополнительные каталоги библиотек Я добавил эти пути:
- C:\Program Files\boost\boost_1_37_0\libs
- C:\Program Files\boost\boost_1_37_0\libs\filesystem\build\msvc-9.0express\debug\link-static\threading-multi
Я добавил второй из отчаяния. Это точная директория, в которой находится libboost_system-vc90-mt-gd-1_37.lib.
-
В Свойства конфигурации > C/С++ > Общие > Дополнительные каталоги Include Я добавил следующий путь:
- C:\Program Files\boost\boost_1_37_0
-
Затем, чтобы поместить глазурь на торт, в разделе Инструменты > Опции VС++ Каталоги > Библиотечные файлы, я добавил те же каталоги, упомянутые на шаге 3.
Несмотря на все это, когда я создаю свой проект, я получаю следующую ошибку:
fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-gd-1_37.lib'
Кроме того, вот код, который я пытаюсь скомпилировать, а также скриншот из вышеперечисленного каталога, где находится (предположительно правильный) файл lib:
#include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations
#include <iostream> // for std::cout
using boost::filesystem; // for ease of tutorial presentation;
// a namespace alias is preferred practice in real code
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
Ответы
Ответ 1
Ответ Ферруччио содержит большую часть проницательности. Однако Пукку заставил меня понять мою ошибку. Я отправляю свой собственный ответ, чтобы дать полное объяснение. Как объяснил Ферруччио, файловая система опирается на две библиотеки. Для меня это:
- libboost_system-vc90-мт-Г.Д.-1_37.lib
- libboost_filesystem-vc90-мт-Г.Д.-1_37.lib
Я не должен был замечать, что когда я предоставил каталог для libboost_filesystem-vc90-mt-gd-1_37.lib, выход ошибки изменился с
fatal error LNK1104: cannot open file 'libboost_filesystem-vc90-mt-gd-1_37.lib'
к
fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-gd-1_37.lib'
Мне кажется, что ошибка сохраняется. Это привело меня к публикации некоторой довольно неточной информации. Кроме того, после чтения, что для файловой системы требуются две библиотеки, теперь я вижу значение ключевого слова stage для команды bjam. Поставляя
bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete stage
Заставляет bjam поместить дополнительный каталог, метко названный stage, в каталог boost_1_37_0. Эта папка содержит папку с именем /lib, в которой есть копии всех файлов lib в одном месте. Это удобно для Visual С++, потому что вы можете предоставить его с помощью этой единственной директории, и она позаботится обо всех зависимостях.
Ответ 2
boost:: filesystem зависит от boost:: system, поэтому вам нужны оба пути.
Частично проблема заключается в том, что вы используете ускоряющие libs из каталогов сборки вместо установочного каталога (процесс сборки boost должен создавать оба). В каталоге install/lib есть все библиотеки, поэтому вам нужно указать только один путь.
Процесс сборки boost создает каждую библиотеку в своем собственном каталоге. В конце он копирует все эти .lib файлы в один общий каталог lib.
Поскольку вы не указали каталог установки как часть вашей команды сборки (с -prefix =...), я считаю, что по умолчанию это C:\Boost. Проверьте, есть ли этот каталог, и если да, используйте C:\boost\include\boost-1_37 для вашего пути include и C:\boost\lib для вашего пути к библиотеке.
Ответ 3
Я думаю, что настоящая оригинальная проблема связана с процессом сборки по умолчанию в Windows, который ожидает статического связывания библиотеки, которая будет иметь имя beginning libboost_sytem<etc..>
. Необходимый макрос
#define BOOST_SYSTEM_DYN_LINK
что гарантирует, что библиотека Boost.System динамически связана. Имя динамической библиотеки boost_system<etc...>
, как и статическая библиотека libboost_sytem<etc...>
Ответ 4
Последний ответ правильный.
Но вы должны найти форматированный файл $BOOST\config\user.hpp и
раскомментируйте эту директиву #define BOOST_ALL_DYN_LINK.
Теперь он начинает использовать динамическую связь с boost и должен работать.
Ответ 5
Ошибка, которую вы опубликовали, жалуется на файл libboost_system-vc90-mt-gd-1_37.lib, но в каталоге у вас есть только libboost_filesystem-vc90-mt-gd-1_37.lib, правильно?
Посмотрите на libboost_system-vc90-mt-gd-1_37.lib. Если вы его найдете, добавьте соответствующий каталог в путь поиска библиотеки. Если вы его не нашли, посмотрите, есть ли у вас boost_system-vc90-mt-gd-1_37.lib(как и я) и попробуйте скопировать его в желаемое имя файла.
Ответ 6
Командная строка bjam должна иметь все версии всех библиотек. Тем не менее, когда вы создаете с помощью
bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete stage
(обратите внимание на stage
в конце) все библиотеки копируются в общую папку libs/, так что функция автозапуска MSVC работает, когда вы добавляете эту папку libs/в свой путь к библиотеке.
Я не знаю, будет ли bjam без stage
копировать все эти файлы в одну папку. Если нет, выполните такую конструкцию stage
, чтобы сделать это. Если они, ну, извините, конфигурация кажется правильной, возможно, небольшая ошибка ввода?
Ответ 7
У меня была такая же проблема, что вам нужно сделать, это добавить каталог "lib" под папкой повышения верхнего уровня в путь библиотеки в Visual С++.
Это определенно решило проблему для меня.