compile glog and glags on windows

Series

Guide

version

gflags

do not use offical version,instead use https://github.com/schuhschuh/gflags.git

git clone https://github.com/schuhschuh/gflags.git 
cd gflags
mkdir windows-build
cd windows-build
cmake-gui ..

with options

BUILD_SHARED_LIBS ON 
INSTALL_SHARED_LIBS ON
INSTALL_STATIC_LIBS OFF
CMAKE_CONFIGURATION_TYPES Release # Release
REGISTER_INSTALL_PREFIX OFF

CMAKE_INSTALL_PREFIX D:/gflags
#NAMESPACE google;gflags
NAMESPACE google

or command

cmake -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC ..

we get include and lib/gflags.lib, and bin/gflags.dll
modify CMAKE/CMAKE_INSTALL_PREFIX to a non-system folder, otherwise you will need administrative privileges to run INSTALL project.

glog

Notice:
we have to new entry with BUILD_SHARED_LIB with value ON, because by default, glog is static library with extension .lib.
`bash
wget https://github.com/google/glog/archive/v0.3.5.zip

mkdir windows-build
cd windows-build
cmake-gui ..


with options 

    #WITH_GFLAGS ON 
    #gflags_DIR D:/gflags/lib/cmake/gflags

    WITH_GFLAGS OFF
    CMAKE_INSTALL_DIR d:/glog
    CMAKE_CONFIGURATION_TYPES Release # Release

    BUILD_SHARED_LIBS ON  # new by hand

generate `sln` and open with `Visual Studio 2015` compile and install.

and we get preprocessors from `glog`

    WIN32
    _WINDOWS
    NDEBUG
    GLOG_NO_ABBREVIATED_SEVERITIES
    GOOGLE_GLOG_IS_A_DLL=1
    GOOGLE_GLOG_DLL_DECL=__declspec(dllexport)
    GFLAGS_IS_A_DLL=1
    CMAKE_INTDIR="Release"
    LIBGLOG_EXPORTS

> we get `include` and `lib/glog.lib`, and `bin/glog.dll`

### multiple processor compile 

- windows: `set_target_properties(main PROPERTIES COMPILE_FLAGS "/MP")`
- linux: `make -j8`

with cmake options `/MD` added to `CMAKE_CXX_FLAGS_RELEASE`

    CMAKE_CXX_FLAGS_RELEASE /MD /O2 /Ob2 /DNDEBUG /MP

or 

with `CMakeLists.txt`
```cmake
if(MSVC) # WIN32
  set_target_properties(target1 PROPERTIES COMPILE_FLAGS "/MP")
  set_target_properties(target2 PROPERTIES COMPILE_FLAGS "/MP")
  set_target_properties(target3 PROPERTIES COMPILE_FLAGS "/MP")
endif()

project dependency

select ALL-BUILD and change build order by hand.

ZERO_CHECK
CarConfig
CarUtil
CarModel
CarDatabase
a_main
a_unit_tests
data_client
data_server
example_jpeg
example_thread
ALL_BUILD

Example Code

CMakeLists.txt

#find_package(glog 0.3.5 REQUIRED)  
# no GLOG_INCLUDE_DIRS  GLOG_LIBRARIES, we only use  `glog::glog` as target

find_package(glog REQUIRED) 

add_executable(main main.cpp)
target_link_libraries (main  glog::glog)

glog include directory will be imported automatically.

gflags-config.cmake

set(GFLAGS_FOUND TRUE) # auto 
set(GFLAGS_ROOT_DIR "D:/gflags")

find_path(GFLAGS_INCLUDE_DIR NAMES gflags/gflags.h PATHS "${GFLAGS_ROOT_DIR}/include") 
mark_as_advanced(GFLAGS_INCLUDE_DIR) # show entry in cmake-gui

find_library(GFLAGS_LIBRARY NAMES gflags.lib PATHS "${GFLAGS_ROOT_DIR}/lib") 
mark_as_advanced(GFLAGS_LIBRARY) # show entry in cmake-gui

# use xxx_INCLUDE_DIRS and xxx_LIBRARIES in CMakeLists.txt
set(GFLAGS_INCLUDE_DIRS ${GFLAGS_INCLUDE_DIR} )
set(GFLAGS_LIBRARIES ${GFLAGS_LIBRARY} )

message( "gflags-config.cmake " ${GFLAGS_ROOT_DIR})

glog-config.cmake

set(GLOG_FOUND TRUE) # auto 
set(GLOG_ROOT_DIR "D:/glog")

find_path(GLOG_INCLUDE_DIR NAMES glog/logging.h PATHS "${GLOG_ROOT_DIR}/include") 
mark_as_advanced(GLOG_INCLUDE_DIR) # show entry in cmake-gui

find_library(GLOG_LIBRARY NAMES glog.lib PATHS "${GLOG_ROOT_DIR}/lib") 
mark_as_advanced(GLOG_LIBRARY) # show entry in cmake-gui

# use xxx_INCLUDE_DIRS and xxx_LIBRARIES in CMakeLists.txt
set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR} )
set(GLOG_LIBRARIES ${GLOG_LIBRARY} )

message( "glog-config.cmake " ${GLOG_ROOT_DIR})

main.cpp

#include <gflags/gflags.h>
#include <glog/logging.h>

int main(int argc, char **argv)
{
    /*
    FLAGS_logtostderr = true;  
    FLAGS_alsologtostderr = true;  
    FLAGS_colorlogtostderr = true;  
    FLAGS_log_prefix = true;  

    FLAGS_logbufsecs = 0;  //0 means realtime
    FLAGS_max_log_size = 10;  // MB
    */
    google::InitGoogleLogging(argv[0]); // init google logging
    google::SetLogDestination(google::GLOG_FATAL, "../log/log_fatal_"); 
    google::SetLogDestination(google::GLOG_ERROR, "../log/log_error_"); 
    google::SetLogDestination(google::GLOG_WARNING, "../log/log_warning_");
    google::SetLogDestination(google::GLOG_INFO, "../log/log_info_"); 

    LOG(INFO) << "Hello GLOG";

    return 0;
}

copy gflags.dll and glog.dll to main executable folder.

errors

error:

fatal error C1189: #error :  ERROR macro is defined. Define GLOG_NO_ABBREVIATED_SEVERITIES before including logging.h. See the document for detail.  

solution:

find_package(GFLAGS REQUIRED) # user-defined
find_package(GLOG REQUIRED) # user-defined
include_directories(${GFLAGS_INCLUDE_DIRS})
include_directories(${GLOG_INCLUDE_DIRS})

# add macro GLOG_NO_ABBREVIATED_SEVERITIES
add_definitions( -DGLOG_NO_ABBREVIATED_SEVERITIES ) 

Reference

History

  • 20180206: created.
  • 20180207: add multiple processor and build dependency part for windows.
  • 20180209: add error and solutions

Author: kezunlin
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source kezunlin !
评论
  TOC