Building the 64-bit version of Chromium Embedded Framework on Windows

The Chromium Embedded Framework (CEF for short) is an open source framework for embedding Chromium-based browsers in other applications. The base implementation is targeting C/C++ applications but ports for other languages exist (these include Java, C#, Delphi, Python).

The nightly builds (for various systems and platforms) of CEF are available for download at https://cefbuilds.com/. These include:

  • CEF source code necessary to build your apps with
  • CEF dynamic and static library files (together with its dependencies) that you must use in your application
  • C++ wrappers for the C API
  • source code of two sample applications, one called CefSimple and one called CefClient
  • symbol files for debugging binary distribution of CEF
  • build of CefClient sample app with all dependencies and resources

Building the 64-bit version of the sample applications is not straight forward though. In this article I will show what you have to do make it work.

Prerequisites

The following prerequisites are necessary:

  • Visual Studio 2013
  • CMake tools

Notice: Though CMake should be able to generate projects for Visual Studio 2015, I was not able to make it happen. Moreover, the cef_sandbox.lib lib is built with Visual C++ 2013 which means the modules that are linking it should also be built with the same tool set.

You should download the nightly build of the development branch for Windows 64 bit and unzip it.

Create Visual Studio projects

To create Visual Studio projects run the following command from the CEF’s main folder in a console:

cmake -G "Visual Studio 12"

This will create:

  • a VC++ 2013 solution called cef.sln in the main folder
  • VC++ 2013 project files for libcef_dll, cefsimple, cefclient
  • two additional project files called ALL_BUILD and ZERO_CHECK

This is how the content of the CEF folder looks after generating the Visual Studio project and solution files.
cef3

This is how the Visual Studio solutions looks.
cef1

Create 64-bit configurations

Though the download is suppose to represent the 64-bit version of the framework, and the DLLs and LIBs in the Debug and Release folder (i.e. the CEF builds and its dependencies) are indeed built for the x64 platform, the generated projects do not have configurations targeting the x64 platform.

What you have to do is:

  • create configuration for targeting the x64 platform (by copying the settings from x86)
    cef7
  • change the Output Directory for all projects and configurations to be $(SolutionDir)$(Configuration)\ which means the output folder will be the existing Debug or Release folder from the main CEF folder.
    cef8
  • for the libcef_dll project change the Librarian > All Options > Additional options to /machine:X64 %(AdditionalOptions)
    cef9
  • for the cefsimple and cefclient projects change the additional dependencies settings to point to libcef.lib, libcef_dll_wrapper.lib and cef_sandbox.lib, instead of the relative paths as in the project.
    cef10
    This is how the list should look for all platforms and configurations:

    kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;libcef.lib;libcef_dll_wrapper.lib;comctl32.lib;rpcrt4.lib;shlwapi.lib;cef_sandbox.lib;dbghelp.lib;psapi.lib
  • for the cefsimple and cefclient projects add $(SolutionDir)$(Configuration)\ to the Library Directories for all configurations and platforms
    cef11
  • modify the Post Build Event for the cefsimple and cefclient projects to no longer copy files from the solution’s Debug and Release folders to the project’s Debug and Release folders.

    Initially, the post build event looks like this (for Debug configurations)

    setlocal
    mt.exe -nologo -manifest "C:/Dev/CEF0/cefsimple/cefsimple.exe.manifest" "C:/Dev/CEF0/cefsimple/compatibility.manifest" -outputresource:"C:/Dev/CEF0/cefsimple/Debug/cefsimple.exe";#1
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Debug/d3dcompiler_43.dll C:/Dev/CEF0/cefsimple/Debug/d3dcompiler_43.dll
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Debug/d3dcompiler_47.dll C:/Dev/CEF0/cefsimple/Debug/d3dcompiler_47.dll
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Debug/libcef.dll C:/Dev/CEF0/cefsimple/Debug/libcef.dll
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Debug/libEGL.dll C:/Dev/CEF0/cefsimple/Debug/libEGL.dll
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Debug/libGLESv2.dll C:/Dev/CEF0/cefsimple/Debug/libGLESv2.dll
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Debug/natives_blob.bin C:/Dev/CEF0/cefsimple/Debug/natives_blob.bin
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Debug/snapshot_blob.bin C:/Dev/CEF0/cefsimple/Debug/snapshot_blob.bin
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Debug/wow_helper.exe C:/Dev/CEF0/cefsimple/Debug/wow_helper.exe
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Resources/cef.pak C:/Dev/CEF0/cefsimple/Debug/cef.pak
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Resources/cef_100_percent.pak C:/Dev/CEF0/cefsimple/Debug/cef_100_percent.pak
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Resources/cef_200_percent.pak C:/Dev/CEF0/cefsimple/Debug/cef_200_percent.pak
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Resources/cef_extensions.pak C:/Dev/CEF0/cefsimple/Debug/cef_extensions.pak
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Resources/devtools_resources.pak C:/Dev/CEF0/cefsimple/Debug/devtools_resources.pak
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_if_different C:/Dev/CEF0/Resources/icudtl.dat C:/Dev/CEF0/cefsimple/Debug/icudtl.dat
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd
    setlocal
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -E copy_directory C:/Dev/CEF0/Resources/locales C:/Dev/CEF0/cefsimple/Debug/locales
    if %errorlevel% neq 0 goto :cmEnd
    :cmEnd
    endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
    :cmErrorLevel
    exit /b %1
    :cmDone
    if %errorlevel% neq 0 goto :VCEnd

    It should be changed to look like this (beware at the output folder indicated by outputresource; it should be the Debug\Release folder in the main folder):

    setlocal
    mt.exe -nologo -manifest "C:/Dev/CEF0/cefsimple/cefsimple.exe.manifest" "C:/Dev/CEF0/cefsimple/compatibility.manifest" -outputresource:"C:/Dev/CEF0/Debug/cefsimple.exe";#1
    

Resources

In the main folder there is a sub-folder called Resources. The entire content of this folder must be copied to the out folders, Debug and/or Release. These files are necessary for the sample applications to run properly.

Building and running

With all these in place you can build the projects. The build should succeed and the content of the Debug folder for instance should look like below.
cef4

You can then run the two sample applications. This is how cefsimple looks.
cef5

This is how cefclient looks.
cef6

8 Replies to “Building the 64-bit version of Chromium Embedded Framework on Windows”

  1. Thank you Marius for all the work you put into this. I have tried to follow every step but the one that modifies the Post Build Event. My experience with build events has only been to use short macros. I cannot find extensive coding in the Post-Build Event (VS 2013 Win7 64bit). Where does all this Post Build Event code reside ? Thanks again. MBP

  2. I should add that it all seems to come together but with error LNK1104: cannot open file ‘libcef.lib’. Also, I am rather confused by all of the Debug and Release folders produced.

  3. How can I hide menu and url bar in cefclient. ? So the page looks like yours version. I have developed an in your way but it requires .net framework to be installed to run. Is there a workaroud for creating a distributable build release version. Which only installs or portable version which does not require any further download of .net framework on the clients system;\.

  4. frankly, I downloaded the stuff .. but how to execute the commands ??
    could you explain better how to proceed ??
    thank you

    OS Windows 10×64

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.