2
votes

I've been attempting to link my project with fftw and so far, I've gotten it to compile, and finish "pass 1" of linking, but not finish. As the FFTW website said, I generated all the .lib files, and copied them to C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\amd64 (since I'm compiling for x64, and this directory is included in my Library Directories), the .h file in my project and the .dll files in the directory of my project executable.

I've copied atutorial program, and the exact error I am getting is:

1>fftw_test.obj : error LNK2019: unresolved external symbol __imp__fftw_free referenced in function "int __cdecl fftw(void)" (?fftwt@@YAHXZ)
1>fftw_test.obj : error LNK2019: unresolved external symbol __imp__fftw_destroy_plan referenced in function "int __cdecl fftw(void)" (?fftwt@@YAHXZ)
1>fftw_test.obj : error LNK2019: unresolved external symbol __imp__fftw_execute referenced in function "int __cdecl fftw(void)" (?fftwt@@YAHXZ)
1>fftw_test.obj : error LNK2019: unresolved external symbol __imp__fftw_plan_dft_1d referenced in function "int__cdecl fftw(void)" (?fftwt@@YAHXZ)
1>fftw_test.obj : error LNK2019: unresolved external symbol __imp__fftw_malloc referenced in function "int__cdecl fftw(void)" (?fftwt@@YAHXZ)

I've tried:

Project -> Properties -> Linker -> Input -> Additional dependencies

contains libfftw3-3.lib

and dumpbin /exports libfftw3-3.lib generates _fftw_free _fftw_destroy_plan and the other functions that cannot be resolved.

Is it because it's looking for __imp_fftw_functionname and it's only finding _fftw_functionname functions?

Anyway, maybe this will help too: In pass 1, several times it says Searching C:...\VC\lib\amd64\libfftw3-3.lib: but it never says "found", "referenced", or "loaded" like it it does for other libraries.

1
You actually copied 3rd party libraries to your Visual Studio installation directory?? A much better way to do this is to enter the library path in Linker -> General -> Additional Library Directories and then enter the library name in Additional Dependencies as you've already done.Praetorian
The __imp prefix is used for symbols declared __declspec(dllimport).SChepurin

1 Answers

0
votes

If you are familiar with CMake you can use this approach:

I created this CMake file for fftw-3.3.2 which I tested with Visual Studio 2010 x64:

cmake_minimum_required ( VERSION 2.8)
PROJECT ( fftw-3.3.2 )

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG    ../../Debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE  ../../Release)

# Standard:          /DWIN32 /D_WINDOWS /W3 /Zm1000 /EHsc /GR
IF (WIN32)
        SET(CMAKE_CXX_FLAGS "/DWIN32 /D_WINDOWS /W4 /Zi /EHsc /GR- /MP /openmp /bigobj") 
        ADD_DEFINITIONS(-D_OPENMP -DFFTW_DLL -DLIBFFTWF33_EXPORTS) # Visual Studio 2005 and up supports OpenMP
ENDIF (WIN32)


file(GLOB           fftw_api_SOURCE                 api/*.c             api/*.h)
file(GLOB           fftw_dft_SOURCE                 dft/*.c             dft/*.h)
file(GLOB           fftw_dft_scalar_SOURCE          dft/scalar/*.c      dft/scalar/*.h)
file(GLOB           fftw_dft_scalar_codelets_SOURCE dft/scalar/codelets/*.c     dft/scalar/codelets/*.h)
file(GLOB           fftw_dft_simd_SOURCE            dft/simd/*.c        dft/simd/*.h)

file(GLOB           fftw_dft_simd_sse2_SOURCE       dft/simd/sse2/*.c   dft/simd/sse2/*.h)
file(GLOB           fftw_kernel_SOURCE              kernel/*.c          kernel/*.h)
file(GLOB           fftw_rdft_SOURCE                rdft/*.c            rdft/*.h)
file(GLOB           fftw_rdft_scalar_SOURCE         rdft/scalar/*.c     rdft/scalar/*.h)

file(GLOB           fftw_rdft_scalar_r2cb_SOURCE    rdft/scalar/r2cb/*.c 
                                                    rdft/scalar/r2cb/*.h)
file(GLOB           fftw_rdft_scalar_r2cf_SOURCE    rdft/scalar/r2cf/*.c 
                                                    rdft/scalar/r2cf/*.h)
file(GLOB           fftw_rdft_scalar_r2r_SOURCE     rdft/scalar/r2r/*.c 
                                                    rdft/scalar/r2r/*.h)

file(GLOB           fftw_rdft_simd_SOURCE           rdft/simd/*.c       rdft/simd/*.h)
file(GLOB           fftw_rdft_simd_sse2_SOURCE      rdft/simd/sse2/*.c  rdft/simd/sse2/*.h)

file(GLOB           fftw_reodft_SOURCE              reodft/*.c          reodft/*.h)
file(GLOB           fftw_simd_support_SOURCE        simd-support/*.c    simd-support/*.h)
#file(GLOB          fftw_threads_SOURCE             threads/*.c         threads/*.h)


set(${fftw_threads_SOURCE}
    threads/api.c 
    threads/conf.c 
    threads/ct.c 
    threads/dft-vrank-qeq1.c
    threads/f77api.c
    threads/hc2hc.c
    threads/openmp.c
    threads/rdft-vrank-geq1.c
    threads/vrank-geq1-rdft2.c)

source_group(fftw\\api                      FILES ${fftw_api_SOURCE})
source_group(fftw\\dft                      FILES ${fftw_dft_SOURCE})

source_group(fftw\\dft\\scalar              FILES ${fftw_dft_scalar_SOURCE})
source_group(fftw\\dft\\scalar\\codelets    FILES ${fftw_dft_scalar_codelets_SOURCE})
source_group(fftw\\dft\\simd                FILES ${fftw_dft_simd_SOURCE})
source_group(fftw\\dft\\simd\\sse2          FILES ${fftw_dft_simd_sse2_SOURCE})


source_group(fftw\\kernel                   FILES ${fftw_kernel_SOURCE})
source_group(fftw\\rdft                     FILES ${fftw_rdft_SOURCE})
source_group(fftw\\rdft\\scalar             FILES ${fftw_rdft_scalar_SOURCE})

source_group(fftw\\rdft\\scalar\\r2cb       FILES ${fftw_rdft_scalar_r2cb_SOURCE})
source_group(fftw\\rdft\\scalar\\r2cf       FILES ${fftw_rdft_scalar_r2cf_SOURCE})
source_group(fftw\\rdft\\scalar\\r2r        FILES ${fftw_rdft_scalar_r2r_SOURCE})

source_group(fftw\\rdft\\simd               FILES ${fftw_rdft_simd_SOURCE})
source_group(fftw\\rdft\\simd\\sse2         FILES ${fftw_rdft_simd_sse2_SOURCE})

source_group(fftw\\reodft                   FILES ${fftw_reodft_SOURCE})
source_group(fftw\\simd_support             FILES ${fftw_simd_support_SOURCE})
source_group(fftw\\threads                  FILES ${fftw_threads_SOURCE})

include_directories(
    kernel
    api
    dft
    dft/scalar
    dft/scalar/codelets # rellay needed?
    dft/simd
    dft/simd/sse2
    rdft
    rdft/scalar
    rdft/simd
    reodft
    ${CMAKE_CURRENT_SOURCE_DIR} # thats where the config.h is located
    simd-support
)

# Create a target for the library
ADD_LIBRARY(fftw-3.3.2 SHARED 
    ${fftw_api_SOURCE}
    ${fftw_dft_SOURCE}
    ${fftw_dft_scalar_SOURCE}
    ${fftw_dft_scalar_codelets_SOURCE}
    ${fftw_dft_simd_SOURCE}
    ${fftw_dft_simd_sse2_SOURCE}
    ${fftw_kernel_SOURCE}
    ${fftw_rdft_SOURCE}
    ${fftw_rdft_scalar_SOURCE}

    ${fftw_rdft_scalar_r2cb_SOURCE}
    ${fftw_rdft_scalar_r2cf_SOURCE}
    ${fftw_rdft_scalar_r2r_SOURCE}

    ${fftw_rdft_simd_SOURCE}
    ${fftw_rdft_simd_sse2_SOURCE}
    ${fftw_reodft_SOURCE}
    ${fftw_simd_support_SOURCE}
    ${fftw_threads_SOURCE}
)

You also need this config.h file.

This will solve all building problems with Windows - it would immediately add support for (with small changes maybe)

  • Visual Studio 6
  • Visual Studio 7
  • Visual Studio 7 .Net 2003
  • Visual Studio 8 2005
  • Visual Studio 8 2005
  • Visual Studio 8 2005 Win64
  • Visual Studio 9 2008
  • Visual Studio 9 2008 IA64
  • Visual Studio 9 2008 Win64
  • Visual Studio 10
  • Visual Studio 10 Win64
  • Visual Studio 10 IA64
  • Visual Studio 11
  • Visual Studio 11 Win64
  • Visual Studio 11 ARM