zoukankan      html  css  js  c++  java
  • Windows 10上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on windows from source

    本文首发于个人博客https://kezunlin.me/post/bb64e398/,欢迎阅读!

    compile glog v0.3.5 and glags on windows from source.

    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.

    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

    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

    Copyright

  • 相关阅读:
    ajax 跨域 Access-Control-Allow-Origin
    关于 请求参数 传递时 参数字符串里面包含 特殊符号的 解决~
    鼠标滚动事件
    js 选择随机数
    html 关于一行两列 高度不定的实现(不用table)
    关于php跨域操作(主域不同)
    写规范的javascript脚本代码 之for in
    windows服务等获取文件路径文件目录方法
    C#如何在控制台应用程序中加入配置文件
    easyui Microsoft JScript 运行时错误: “JSON”未定义
  • 原文地址:https://www.cnblogs.com/kezunlin/p/11841211.html
Copyright © 2011-2022 走看看