Как связать Boost в зависимой статической библиотеке - PullRequest
20 голосов
/ 19 января 2011

В MS Visual C ++ 2010

В моем решении был один проект C ++, который использовал boost и работал отлично.

Затем я решил преобразовать этот проект в статическую библиотеку и создать новый проект, который зависит от этой статической библиотеки.

Теперь моя преобразованная статическая библиотека собирается без ошибок и предупреждений (компилятор и компоновщик) но новый проект компилируется, но не связывается.

Я получаю:

1>LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc100-mt-1_45.lib'

В качестве теста я добавил полный путь к каталогу к параметрам компоновщика для этой библиотеки ... а затем он пожаловался на

1>LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc100-mt-1_45.lib'

Я добавил полные пути ко всем библиотекам, и теперь он собирается и запускается.

Я не доволен этим решением, потому что:

  1. Я не хочу, чтобы пользователи библиотеки надо беспокоиться о связывании в увеличение.
  2. Это грязно

Я знаю, что ответом будет создание DLL, но есть ли способ сделать это статически и сохранить связь на уровне моей статической библиотеки.

Edit:

Если я скажу компоновщику .exe явное игнорирование библиотек boost, тогда все будет в порядке, за исключением того, что .exe вообще не придется беспокоиться о boost.

/NODEFAULTLIB:"libboost_thread-vc100-mt-1_45.lib" /NODEFAULTLIB:"libboost_date_time-vc100-mt-1_45.lib"

Ответы [ 3 ]

25 голосов
/ 19 января 2011

Очевидно, вам не нужны .libs, так как ваш exe-файл также ссылается без них. Кажется, вы используете методы и классы boost только для заголовков. Так что просто скажите boost, чтобы отключить автоматическое связывание, определив символ препроцессора BOOST_ALL_NO_LIB в вашем проекте.

Если вы хотите сделать ваш .lib ненужным большим, включив все надстройки, этот вопрос, похоже, содержит ответ (который я никогда не пробовал сам): Связывание статических библиотек с другими статическими библиотеками

4 голосов
/ 19 января 2011

При создании вашей библиотеки вы можете включить в нее дополнительные библиотеки.Для этого на странице свойств VisualStudio Librarian > General укажите библиотеки повышения как Additional Dependencies.

Однако может возникнуть проблема, если ваши клиенты используют повышение и статически ссылаются на него (особенно на другуюверсии, чем та, которую вы используете).

1 голос
/ 19 января 2011

Вы создали библиотеку boost?В Boost есть определенные библиотеки, которые нужно скомпилировать.Если вы этого еще не сделали, см. « Начало работы в Windows », чтобы узнать, как создать библиотеку Boost.

EDIT-1: Boost canсоздавать как статические, так и динамически загружаемые (dll) библиотеки.

EDIT-2: Если вы уже создали Boost, то ответ @Daniel Gehriger скажет вам, как его добавитьв ВС

...