Ошибка повышения ссылки при использовании «--layout = system» на VS2005 - PullRequest
3 голосов
/ 17 марта 2010

Я новичок в бусте, и решил попробовать его с некоторыми реалистичными сценариями развертывания для .dll, поэтому я использовал следующую команду для компиляции / установки библиотек:

.\bjam install --layout=system variant=debug runtime-link=shared link=shared
--with-date_time --with-thread --with-regex --with-filesystem
--includedir=<my include directory> --libdir=<my bin directory> > installlog.txt

Это, похоже, работает, но моя простая программа (взято прямо со страницы "Начало работы") не работает:

#include <boost/regex.hpp>
#include <iostream>
#include <string>

// Place your functions after this line
int main()
{
    std::string line;
    boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

    while (std::cin)
    {
        std::getline(std::cin, line);
        boost::smatch matches;
        if (boost::regex_match(line, matches, pat))
            std::cout << matches[2] << std::endl;
    }
}

Сбой из-за следующей ошибки компоновщика:

fatal error LNK1104: cannot open file 'libboost_regex-vc80-mt-1_42.lib'

Я уверен, что .lib и .dll находятся в этом каталоге и названы так, как я хочу, чтобы они были (то есть: boost_regex.lib и т. Д., Все не версионно, как говорит система --layout =) , Так почему же он ищет версионный тип? И как мне заставить его искать неверсионный тип библиотеки?

Я пробовал это с более "нормальными" вариантами, такими как ниже:

.\bjam stage --build-type=complete --with-date_time --with-thread --with-filesystem --with-regex > mybuildlog.txt

И это прекрасно работает. Я удостоверился, что мой компилятор увидел каталог "stage \ lib", и он скомпилировался и работал нормально, кроме того, что среда смотрела в правильный каталог lib. Но когда я убрал эти «тестовые» каталоги и захотел использовать эти другие (неверсированные), то это не удалось.

Я нахожусь под VS2005 здесь на XP. Есть идеи?

Ответы [ 2 ]

5 голосов
/ 17 марта 2010

Быстрый ответ, потому что у меня нет доступа к Visual C ++ дома.

Я полагаю, что вы сталкиваетесь с "автосвязью" Boost на компиляторах Visual C ++.

Решением было бы отключить «автолинк» (см. Документацию для этого: быстрый поиск в Google показал макрос «BOOST_ALL_NO_LIB», чтобы отключить автосвязь для ВСЕХ библиотек Boost), а затем явно привязать ваш проект к нужной библиотеке.

Я обновлю этот ответ как можно скорее.

0 голосов
/ 24 марта 2010

Я также столкнулся с этой странной (для меня) ошибкой компоновщика для моей сборки Повышение на Windows Server 2003 с использованием VS2005. Я использую аналог bjam параметры командной строки, как OP, но без --layout=system вариант, так как я не возражаю против информации о версии в них (пока нет).

Исполнительное резюме следующего слова: Если вы видите LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc80-mt-gd-1_42.lib', то вам нужно указать те же самые -D параметры строки компиляции в вашей нисходящей сборке приложения как Сборки Boost выполняются при сборке библиотеки Boost Regex. В документации не указано, что AFAICT (по состоянию на 2010-03-23). ​​

Детали: я нашел довольно полезные вещи для отладки этой проблемы:

  1. Используйте опцию -d+2 для bjam при сборке. Это сбрасывает огромное количество записей о том, какие именно параметры командной строки использовался. Вот как я определил, что -DBOOST_ALL_NO_LIB=1 и -DBOOST_REGEX_DYN_LINK=1 были указаны на cl.exe строка компиляции при сборке библиотеки Boost Regex.

  2. Поймите, что вы должны также поставить такие же специальные -D флаги (используйте опции -D или /D, которые VS2005 принимает как те же вещь), когда вы компилируете файлы .cpp в приложении, которое использует это Boost библиотека (верно для Boost Regex, и я предполагаю, что это правда для других, что я не подтвердил). Вот почему вы увидите ошибка компоновщика: LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc80-mt-gd-1_42.lib', так как без -DBOOST_ALL_NO_LIB=1 и -DBOOST_REGEX_DYN_LINK=1 опции, автоматическое связывание сработает, когда компилятор проанализирует your .cpp файл и заголовок #include Boost, последний из которых #include - это заголовки авто-связывания, последние из которых по умолчанию используется логика автоматической компоновки, которая является прагмой компилятора это говорит компоновщику, какую библиотеку использовать. И угадайте, какие из них ту логику автосвязывания выбирает по умолчанию? Ответ: статический те, которые имеют форму libblablabla.lib, а не blablabla.lib Какие библиотеки импорта вы ожидаете. это логика директив линкера на основе прагмы - это то, что заставило меня гоняться за хвостом в течение 3 часов пытаясь выяснить, что я сделал не так на моем компоновщике линия, когда он находится под контролем C-препроцессора в автоматическом связывании логика, которая сделала это.

...