Generating 64-bit projects for Visual Studio with CMake


Hm, interesting… I thought for some reason that by invoking CMake from the 64-bit Visual Studio command prompt, the project would automatically be generated as a 64-bit target — turns out that this is not the case: Checking the Solution File, the configuration is still set to Win32 (instead of x64) and in the project properties under Linker → Advanced, the Target Machine is still set to /MACHINE:X86 (instead of X64).

So one has to specifically tell CMake to create a 64-bit project:

C:\projectx\build> cmake ..\make -G "Visual Studio 10 Win64"

Library paths

Also, make sure to include the right paths for the 64-bit libraries if you build a 64-bit target; in one case, I only added the top-level directory of the Windows SDK instead of the required sub-folder, which resulted in a lot of linker errors (LNK2019: unresolved external symbol… etc.).

C:/Program Files/Microsoft SDKs/Windows/v7.1/Lib/x64

Check in CMakeLists.txt

As far as I could find out, CMake doesn’t offer an easy way to detect the architecture of the target platform (but then, how could it?), so the CMakeLists.txt for my Windows-/Visual-Studio-64-bit-only project has currently the following condition at the beginning:
Maybe not the most elegant solution, but it works for the moment.

(2017-03-30: Small update to this post, thanks to a helpful tip from Robin Degen [when this blog was running with WordPress and had an internal commenting system].)

And indeed, in the years since I wrote this (and learned more about CMake), I discovered the popular idiom to check whether the build is done for(!) a 64-bit target and by now, practically all my CMakeLists contain boilerplate code like this:

else ()
endif ()

if (MSVC)                                                        # - Microsoft Visual C++
    if (CMAKE_CL_64 OR ${PROJECTNAME_ARCHITECTURE} EQUAL "x64")  # -- 64-bit builds.
        # [...]
    else ()                                                      # -- 32-bit builds.
        # [...]
    endif ()
        # [...]
else ()	
    message(FATAL_ERROR "\nError: Only Microsoft Visual Studio is currently supported.\n")
endif ()