Библиотеки автолинков Boost, которые не созданы Boost, но предназначены - PullRequest
3 голосов
/ 11 августа 2010

Я занимаюсь разработкой математического приложения, которое можно расширить, написав скрипты на Python.

Я использую Qt 4.6.3 (собранный как статическая библиотека, версии для отладки и выпуска) и Boost 1.43.0 (собранный как статическая библиотека, для runtime-link также задана статическая многопоточная версия, отладка и выпуск). Все построено с MSVC ++ 2008. Boost построил следующие библиотеки:

  • libboost_python-vc90-т-ы-1_43.lib
  • libboost_python-vc90-мт-s.lib
  • libboost_python-vc90-мт-синг-1_43.lib
  • libboost_python-vc90-мт-sgd.lib

Мой проект компилируется, но выдает следующую ошибку на этапе компоновки:

1>Linking...
1>LINK : fatal error LNK1104: cannot open file 'boost_python-vc90-mt-gd-1_43.lib'

Почему он не выбирает одну из моих скомпилированных библиотек?

Я думаю, что s в именах библиотек означает статические, но тогда функция автоматического связывания, похоже, выбирает динамическую библиотеку, и я хочу, чтобы все статически связывалось в одном исполняемом файле.

То же самое происходит с библиотекой регулярных выражений: у меня скомпилированы те же 4 библиотеки регулярных выражений, и быстрый тест показывает эту ошибку компоновки:

1>LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc90-mt-gd-1_43.lib'

Что делать?

Ответы [ 3 ]

7 голосов
/ 12 августа 2010

Вы можете определить BOOST_ALL_NO_LIB.Это предотвращает автоматическое связывание библиотек наддува, и вам необходимо вручную связать необходимые библиотеки надстроек.

3 голосов
/ 11 августа 2010

Проблема исправлена, во время компиляции буст-библиотек я выбрал опцию link = static. Который создает статические библиотеки. Я также выбрал runtime-link = static, и это было неправильно!

Решением этой проблемы была компиляция boost с помощью runtime-link = shared. Теперь добавлены некоторые дополнительные библиотеки с правильными именами файлов, чтобы компоновщик мог их найти. Сначала компилятор все еще ищет библиотеку dll (boost_python-vc90-mt-gd-1_43.lib вместо libboost_python-vc90-mt-gd-1_43.lib), все остальное от boost ссылки автоматически на статическую библиотеку, но потому что boost.python имеет другую настройку автоматической связи, когда вы предоставляете BOOST_PYTHON_STATIC_LIB, он, наконец, связывается с нужной библиотекой и работает!

3 голосов
/ 11 августа 2010

Если 's' действительно означает статический (я не знаю всех этих модификаторов наизусть), определите символ BOOST_ALL_DYN_LINK при компиляции (добавьте его в опции командной строки). Это говорит boost, чтобы связать с библиотеками DLL. Также можно скомпилировать / установить статические библиотеки повышения.

...