2016-02-20 2 views
1

J'essaie d'utiliser Visual Studio 2015 pour compiler un projet utilisant FFTW. Malheureusement, les binaires précompilés du site Web de FFTW ne sont pas compatibles avec VS 2015, en raison de ce problème: unresolved external symbol __imp__fprintf and __imp____iob_func, SDL2. Vous obtenez une erreur de lien lorsque vous essayez de compiler.Utiliser FFTW avec Visual Studio 2015

Je suis à la recherche de conseils sur la façon de compiler une version compatible. La réponse évidente serait de recompiler FFTW avec VS 2015, mais je ne trouve aucune instruction sur la façon de le compiler avec Visual Studio, et beaucoup de suggestions qu'il serait difficile de faire cela. La version standard a été compilée avec MinGW, et ils fournissent des instructions sur la façon de le faire. Mais MinGW peut-il produire une bibliothèque compatible avec VS 2015? Je n'ai trouvé aucune information à ce sujet non plus.

Répondre

1

J'ai finalement réussi à comprendre cela moi-même. Je ne promets pas que je l'ai fait de la meilleure façon, puisque je ne suis pas un expert de Visual Studio, mais ça a marché. Donc, pour le bénéfice de la postérité, voici ce que j'ai fait.

D'abord, dupliquez config.h.in. Appelez la nouvelle copie config.h. Maintenant, éditez-le à la main pour définir les options de la bibliothèque que vous allez générer: quel mode de précision utiliser, quels ensembles d'instructions vectorielles (le cas échéant) compiler, les tailles de différents types (qui dépendent de si vous planifiez compiler en mode 32 ou 64 bits), si inclure le support de thread, etc.

Créez maintenant un projet VS vide. Je recommande de le mettre au plus haut niveau du dossier source. Ensuite, dans l'Explorateur de solutions, cliquez sur l'icône "Afficher tous les fichiers" en haut. Cela facilitera les étapes suivantes, puisque vous pouvez ajouter ou exclure des fichiers directement à partir de l'Explorateur de solutions.

Affichez la fenêtre Propriétés du projet. Vous devez définir un grand nombre d'options:

En général, définissez "Type de configuration" sur la bibliothèque statique. (Ou vous pouvez le définir en bibliothèque dynamique si vous voulez une DLL, mais vous devrez trouver comment exporter les symboles nécessaires, ce que je n'ai pas fait car je voulais une bibliothèque statique.)

Dans les répertoires VC++, modifiez "Inclure les répertoires". Ajoutez les répertoires suivants (en remplaçant "(source dir)" par le répertoire réel contenant la source):

(source dir) 
(source dir)\api 
(source dir)\dft 
(source dir)\rdft 
(source dir)\reodft 
(source dir)\kernel 
(source dir)\simd-support 
(source dir)\dft\simd 
(source dir)\dft\scalar 
(source dir)\rdft\simd 
(source dir)\rdft\scalar 

Si vous y compris le soutien de filetage, puis en C/C++> Langue, définissez "Open MP Support" oui.

Si vous incluez le support AVX, alors dans C/C++> Génération de code, réglez "Activer Enhanced Instruction Set" sur AVX. Cela signifie que la bibliothèque que vous générez ne fonctionnera pas sur un ordinateur qui ne prend pas en charge AVX. Vous pourrez peut-être contourner cette restriction en définissant uniquement cette option sur les fichiers source individuels qui utilisent AVX. Je ne suis pas certain de ça.

Dans C/C++> Fichiers de sortie, définissez "Nom du fichier objet" sur $(IntDir)/%(RelativeDir)/. (FFTW a beaucoup de fichiers avec les mêmes noms mais dans des répertoires différents, et par défaut VS met tous les fichiers objet dans le même répertoire, ce qui ne fonctionnera pas.)

Maintenant vous êtes prêt à ajouter des fichiers source à le projet, que vous pouvez faire en cliquant droit dans l'Explorateur de solutions et en choisissant "Inclure dans le projet". Vous devez ajouter tous les fichiers .c dans les dossiers suivants:

api 
dft 
dft/scalar 
kernel 
rdft 
rdft/scalar 
reodft 

Si vous souhaitez enfiler un soutien, vous devez ajouter tous les fichiers source dans « fils » sauf pour Threads.C. (Celui-là contient la version de pthreads.)

Si vous souhaitez soutenir pour tous les jeux d'instructions de vecteur, vous devez inclure uniquement les fichiers relatifs à l'instruction particulière vous plonge voulez dans les dossiers suivants:

dft/simd 
rdft/simd 
simd-support 

On peut supposer que si vous voulez un soutien mpi, vous incluez les fichiers dans "mpi". Je n'ai pas fait ça, donc je ne sais pas s'il y a autre chose dont vous aurez besoin pour faire ce travail. Assurez-vous de régler la configuration sur "Release" et "x86" ou "x64", selon le type de binaire que vous voulez. Et maintenant, si je n'ai rien oublié de critique, vous devriez être capable de compiler une bibliothèque.

+0

Merci d'avoir pris le temps de décrire votre solution. J'étais également coincé sur la compatibilité avec VS 2015, et cela ne semble pas être un problème populaire. – benrules2