2010-11-07 2 views
1

У меня есть проект VS10. Я хочу создать код C++, чтобы использовать его в python. Я следил за учебным пособием и помогал ему работать. Однако VS продолжает связывать boost-python-vc100-mt-gd-1_44.lib, но это всего лишь оболочка, которая вызывает boost-python-vc100-mt-gd-1_44.dll. Вот почему мне нужно скопировать DLL с моим .dll (.pyd) файлом. Поэтому я хочу связать boost: python статически с файлом .dll (.pyd). Но я просто не могу найти какой-либо параметр конфигурации в VS или в руководстве для компилятора и компоновщика. Самое странное, что у меня есть один старый проект с использованием boost :: filesystem с той же конфигурацией, но этот проект связан с libboost-filesystem - *. Lib, который является статическим lib, так что все в порядке. Я без разбору работал в течение нескольких часов, и это сводит меня с ума.MSVC - boost :: статическая ссылка python на .dll (.pyd)

Спасибо за любую помощь или предложение.

ответ

0

Какие библиотеки связаны, зависит от настроек вашего проекта. Есть два варианта: Вы можете построить против

  1. статический
  2. динамически

связанных версий С-время выполнения LIBS. В зависимости от того, какая опция выбрана, бустер отправляет правильному #pragma в компоновщик. Эти параметры необходимо устанавливать последовательно во всех проектах, которые составляют вашу программу. Итак, переходите к «свойствам -> C++ -> генерации кода» (или аналогичные, я просто догадываюсь, у меня нет VS up и работает прямо сейчас) и убедитесь, что правильный параметр установлен (последовательно). Конечно, вы должны скомпилировать библиотеки ускорений в требуемом формате до ...

+0

Boost построен с настройками: link = static link = shared threading = single threading = multi variant = debug variant = release runtime-link = static runtime-link = shared, поэтому все должно быть там. В VS, если я устанавливаю C++> CodeGeneration> Runtime = "static", я получил ошибку «фатальная ошибка C1189: #error:« Смешивание библиотеки с расширением dll со статической средой выполнения - это действительно плохая идея ... ». – kangcz

+0

Hm, по какой-то причине повышение по-прежнему предполагает, что вы хотите связать его с DLL. У вас действительно есть все версии boost-библиотек в каталоге установки? Вы можете видеть это по схеме именования. Я не уверен, что параметры, которые вы выписали выше, совместим с '--build-type = complete', вы находитесь в безопасности. Вам нужно установить' C++> CodeGeneration> Runtime = "static" 'для всех проектов и для бегуна. Затем система повышения производительности должна выбрать правая версия библиотек, в противном случае вы можете выбрать требуемую ссылку с помощью '# define's, check boost manual. –

+0

Привет, я действительно не знал, что является целью ранее #pragma. Я искал заголовки и нашел/boost/python/details/config.hpp, чтобы вызвать #pragma для запроса этого .dll. Я попытался прокомментировать это и запросил мой статический .lib, однако это не сработало. Затем я увидел проверку «#define BOOST_PYTHON_STATIC_LIB» в этом заголовке и определил его в моем источнике. Нет ссылок. (но это определение комментируется как устаревшее). Благодарим за помощь. – kangcz

1

Возможно, вы не хотите этого делать. Статически связанный Boost python имеет ряд проблем и причуд, когда импортируется более одной загружаемой библиотеки на основе python. «Но у меня есть только один», - говорите вы. Можете ли вы гарантировать, что у ваших пользователей не будет другого? Что вы, возможно, захотите использовать в будущем? Придерживайтесь DLL. Распространение другой DLL действительно не так уж и важно. Просто поставьте его бок о бок в том же каталоге.

+0

Интересные точки. Просто для любопытства, какие проблемы и причуды вы имеете в виду? – kangcz

+2

В основном, процесс имеет 2 копии таблицы типа BP. Либы, которые должны работать вместе, не могут, потому что они не могут видеть RTTI другого. Больше памяти используется для кода и данных и т. Д. Детали зависят от ОС и всего остального. –

Смежные вопросы