2010-11-07 6 views
1

J'ai reçu un projet VS10. Je veux construire du code C++ pour pouvoir l'utiliser en python. J'ai suivi le tutoriel de boost et je l'ai fait fonctionner. Cependant VS continue de lier boost-python-vc100-mt-gd-1_44.lib mais c'est juste un wrapper qui appelle boost-python-vc100-mt-gd-1_44.dll. C'est pourquoi j'ai besoin de copier le fichier .dll avec mon fichier .dll (.pyd). Donc je veux lier boost: python statiquement à ce fichier .dll (.pyd). Mais je ne trouve aucune option de configuration dans VS ou dans le manuel du compilateur et de l'éditeur de liens. La chose la plus étrange est que j'ai un projet plus ancien utilisant boost :: filesystem avec la même configuration mais que le projet est lié à libboost-filesystem - *. Lib qui est une librairie statique donc c'est ok. J'ai été googling pendant quelques heures sans succès et ça me rend fou.MSVC - boost :: liaison statique python vers .dll (.pyd)

Merci pour toute aide ou suggestion. Quelles bibliothèques sont liées dépend des paramètres de votre projet?

Répondre

0

Il y a deux possibilités: Vous pouvez construire contre

  1. statiquement
  2. dynamiquement

versions liées des libs c-exécution. En fonction de l'option sélectionnée, le boost envoie un #pragma approprié à l'éditeur de liens. Ces options doivent être définies de manière cohérente dans tous les projets qui constituent votre programme. Alors allez dans "properties -> C++ -> génération de code" (ou similaire, je devine juste, ne pas avoir VS en cours d'exécution en ce moment) et assurez-vous que la bonne option est définie (de manière cohérente). Bien sûr, vous devez avoir compilé des bibliothèques boost dans le format requis avant ...

+0

Boost est construit avec les paramètres suivants: link = static link = threading partagé = single threading = variante multiple = debug variante = release runtime-link = statique runtime-link = partagé donc tout devrait être là. Dans le VS si je mets C++> CodeGeneration> Runtime = "statique" j'ai eu une erreur "erreur fatale C1189: #error:" Mélanger une librairie dll boost avec un runtime statique est une très mauvaise idée ... " – kangcz

+0

Hm, pour une raison quelconque, boost suppose toujours que vous voulez lier avec ses dlls.Avez-vous vraiment toutes les versions de bibliothèques boost dans le répertoire d'installation? Vous pouvez le voir dans le schéma de nommage.Je ne suis pas sûr si les options que vous avez écrit ci-dessus sont Avec 'build-type = complete', vous êtes sûr: vous devez définir C++> CodeGeneration> Runtime =" static "' pour tous les projets et pour le coureur. Dans le cas contraire, vous pouvez sélectionner le lien requis avec '# define's, consultez le manuel boost –

+0

Salut, je ne savais vraiment pas quel était le but du #pragma avant. boost/python/details/config.hpp pour appeler #pragma pour demander ce fichier .dll. J'ai essayé de le commenter et a demandé mon .lib statique, mais cela n'a pas fonctionné. Puis j'ai vu la vérification de "#define BOOST_PYTHON_STATIC_LIB" dans cet en-tête et l'ai défini dans ma source. Non, ça lie ok. (mais cette définition est commentée comme obsolète). Merci de votre aide. – kangcz

1

Vous ne voulez probablement pas faire cela. Boost python lié statiquement a un certain nombre de problèmes et de bizarreries lorsqu'il y a plus d'une bibliothèque boost python importée. "Mais je n'en ai qu'un" dis-tu. Pouvez-vous garantir que vos utilisateurs n'en auront pas d'autres? Que vous pourriez vouloir utiliser un autre dans le futur? Stick avec la DLL. Distribuer une autre DLL n'est vraiment pas un gros problème. Mettez-le côte à côte dans le même répertoire.

+0

Point intéressant. Juste pour la curiosité, quel genre de problèmes et de bizarreries voulez-vous dire? – kangcz

+2

Fondamentalement, le processus a 2 copies de la table de type BP. Les libs qui sont censés travailler ensemble ne peuvent pas parce qu'ils ne peuvent pas voir le RTTI de l'autre. Plus de mémoire est utilisée, pour le code et les données, etc. Les détails dépendent du système d'exploitation et de tout le reste. –

Questions connexes