Как устранить ошибку LNK1104 с помощью Boost Filesystem Library в MSCV? - PullRequest
10 голосов
/ 23 января 2009

У меня проблемы с получением моего проекта ссылки на файл lib для файловой системы Boost (версия 1.37.0) в Microsoft Visual C ++ 2008 Express Edition. Библиотека файловой системы - это , а не библиотека только для заголовка. Я следую руководству Getting Started в Windows , опубликованному на официальной веб-странице поддержки. Вот шаги, которые я предпринял:

  1. Я использовал bjam для сборки полного набора файлов lib, используя:

    bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete
    
  2. Я скопировал каталог / libs (расположенный в C: \ Program Files \ boost \ build-boost \ boost \ bin.v2 ) в C : \ Program Files \ boost \ boost_1_37_0 \ libs.

  3. В Visual C ++ в разделе Проект> Свойства> Дополнительные каталоги библиотеки Я добавил следующие пути:

    • 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 .

  4. В Свойства конфигурации> C / C ++> Общие> Дополнительные каталоги включения Я добавил следующий путь:

    • C: \ Program Files \ boost \ boost_1_37_0
  5. Затем, чтобы положить глазурь на торт, под Инструменты> Параметры VC ++ Каталоги> Библиотечные файлы , я добавил те же каталоги, которые упоминались в шаге 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;
}

Ответы [ 7 ]

8 голосов
/ 23 января 2009

Ответ Ферруччо содержит большую часть понимания. Тем не менее, Pukku заставил меня осознать мою ошибку. Я публикую свой ответ, чтобы дать полное объяснение. Как объяснил Ферруччо, файловая система опирается на две библиотеки. Для меня это:

  • 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 C ++, потому что вы можете снабдить его этим единственным каталогом, и он позаботится обо всех зависимостях.

3 голосов
/ 23 января 2009

boost :: filesystem зависит от boost :: system, поэтому вам нужны оба пути.

Часть проблемы заключается в том, что вы используете библиотеки расширения из директорий сборки вместо каталога установки (процесс ускоренной сборки должен создать оба варианта). В каталоге install / lib есть все библиотеки, поэтому вам нужно указать только один путь.

Процесс ускоренной сборки создает каждую библиотеку в своем собственном каталоге. В конце он копирует все эти .lib файлы в один общий каталог lib.

Поскольку вы не указали каталог установки как часть вашей команды сборки (с --prefix = ...), я считаю, что по умолчанию используется C: \ Boost. Проверьте, существует ли этот каталог, и если да, используйте C: \ boost \ include \ boost-1_37 для пути включения и C: \ boost \ lib для пути к библиотеке.

2 голосов
/ 24 апреля 2012

Последний ответ правильный. Но вы должны найти расширенный конфигурационный файл $ BOOST \ config \ user.hpp и раскомментируйте эту директиву #define BOOST_ALL_DYN_LINK. Теперь он начинает использовать динамическую связь с boost и должен работать.

2 голосов
/ 22 февраля 2012

Я думаю, что настоящая оригинальная проблема связана с процессом активной сборки по умолчанию в Windows, который ожидает статическое связывание библиотеки с именем beginning libboost_sytem<etc..>. Макрос, который вам нужен -

#define BOOST_SYSTEM_DYN_LINK

, что обеспечивает динамическую связь библиотеки Boost.System. Имя динамической библиотеки boost_system<etc...> в соответствии со статической библиотекой libboost_sytem<etc...>

1 голос
/ 11 марта 2010

У меня была такая же проблема, что вам нужно сделать, это добавить каталог "lib" в папке Boost верхнего уровня к пути библиотеки в Visual C ++.

Это определенно решило проблему для меня.

1 голос
/ 23 января 2009

В командной строке bjam должны быть собраны все версии всех библиотек. Тем не менее, когда вы строите с

bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete stage

(обратите внимание на stage в конце), все библиотеки копируются в общую папку libs /, поэтому функция автосвязи MSVC работает, когда вы только добавляете эту папку libs / в путь к своей библиотеке.

Я не знаю, копирует ли bjam без stage все эти файлы в одну папку. Если нет, выполните такую ​​сборку stage, чтобы сделать это. Если они, ну, извините, конфигурация кажется правильной, может быть, где-то небольшая ошибка ввода?

1 голос
/ 23 января 2009

Выложенная вами ошибка жалуется на файл libboost_system-vc90-mt-gd-1_37.lib, но в каталоге у вас есть только libboost_ file system-vc90-mt-gd-1_37.lib, право

Найдите libboost_system-vc90-mt-gd-1_37.lib. Если вы найдете его, добавьте соответствующий каталог в путь поиска библиотеки. Если вы не нашли его, посмотрите, есть ли у вас boost_system-vc90-mt-gd-1_37.lib (как я), и попробуйте скопировать его в нужное имя файла.

...