2010-03-16 2 views
2

Я новичок в повышении, и подумал, что я попытаюсь использовать некоторые реалистичные сценарии развертывания для .dll, поэтому я использовал следующую команду для компиляции/установить библиотеки:Ошибка увеличения ссылки при использовании «--layout = system» на VS2005

.\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. Есть идеи?

ответ

5

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

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

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

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

+0

Это сработало, хотя теперь я получаю ошибку shared_ptr (ошибка BOOST_ASSERT для нулевого указателя). Я даже прошел через код и не могу понять, как что-то не инициализировано. Вероятно, потому что я скомпилировал библиотеки без этого флага и пытаюсь скомпилировать приложение с ним, но это все еще не имеет большого смысла. В любом случае, спасибо за помощь. –

0

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

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

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

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

  2. Осознайте, что вы должны также поставить же специальных -D флагов (используйте либо -D или /D опцию, которые VS2005 принимают как же вещи) при компиляции .cpp файлов в приложении, которое использует этот Boost, (true для 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 опционов, автосвязывающих начнутся в том, когда компилятор обрабатывает файла.cpp и заголовок Повысьте #include «s, то последний из которых #include - это автоссылки заголовков, последний из которых по по умолчанию использует логику автосвязывания, которая является компилятором pragmas , который сообщает компоновщику, какую библиотеку использовать. И угадайте, какие из выбирают логику автоматической привязки по умолчанию? Ответ: статические те, которые имеют вид libblablabla.lib, а не blablabla.lib которые являются библиотеками импорта, которые вы ожидаете. Это прагматическая логическая директива линкера - вот что заставило меня преследовать мой хвост в течение 3 часов, пытаясь выяснить, что я сделал не так на моем компоновщике. строка, когда она находится под управлением C-препроцессора в автоматической привязке. логика, которая сделала Это.

+0

Вместо опции командной строки я фактически изменил файл user.hpp в boost \ config, так как тогда это касается как bjam, так и вашего собственного приложения при компиляции. –