在 Linux 上使用 CMake 构建 Google glog

gri*_*sha 5 c++ linux cmake glog

我想用 CMake构建Google glog作为更大项目的一部分(解决方案,用 Visual Studio 的话)。我想要的结果是:

cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug
   -DCMAKE_INSTALL_PREFIX:PATH=xxx {MAIN CMakeLists.txt location}

cmake --build . --target install --config Debug
Run Code Online (Sandbox Code Playgroud)

将在Debug配置中构建解决方案并将文件安装到xxx文件夹。

好的,glog是主要解决方案的子项目:

add_subdirectory(third_party/glog_0.3.4)
Run Code Online (Sandbox Code Playgroud)

在 Windows 上一切正常(请参阅 CMakeLists.txt):一切都按预期工作。

glog在 Linux 上构建,我还需要配置.h.in文件(以及其他工作)。CMakeconfigure_file不起作用:我有.h文件,但它们#undef只包含's。但是glog's./configure工作正常,所以我发现ExternalProject_Add()可能有帮助:

if(UNIX)
include(ExternalProject)

ExternalProject_Add(glog
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure
    CMAKE_GENERATOR 'Unix Makefiles'
    BUILD_COMMAND ${MAKE})
endif()
Run Code Online (Sandbox Code Playgroud)

并且cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX:PATH=xxx .工作正常,但cmake --build . --target install --config Debug会给我:

make: *** No rule to make target 'install'.  Stop.
Run Code Online (Sandbox Code Playgroud)

如果我调用cmake --build . --config Debug,那么它将构建glog并将其安装/usr/local/lib. 下一次尝试:

if(UNIX)
include(ExternalProject)

get_filename_component(glog_absolute_install_dir ${CMAKE_INSTALL_PREFIX} ABSOLUTE)

ExternalProject_Add(glog
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure --prefix=${glog_absolute_install_dir}
    CMAKE_GENERATOR 'Unix Makefiles'
    BUILD_COMMAND ${MAKE}
    INSTALL_DIR ${glog_absolute_install_dir}
    INSTALL_COMMAND "${MAKE}")
endif()
Run Code Online (Sandbox Code Playgroud)

不会将文件安装xxxglog-prefix/src/glog-build/.

好吧,我不知道如何让它工作......以及如何

  1. 指定安装目录
  2. lib 构建类型(静态/共享)
  3. 配置类型(调试/发布) - 不确定现在它是否有效

在 Windows 上,根据 glog 的文档,对于第二种情况,我接下来要做的是:

add_library(${lib_name} ${lib_type} ${src_files})
if(build_shared_lib)
    add_definitions(-DLIBGLOG_EXPORTS)
else()
    add_definitions(-DGOOGLE_GLOG_DLL_DECL=)
endif()
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

Tho*_*mas 0

如今(大概这将在 glog 版本 0.3.5 中), glog 中包含了一个CMakeLists.txt,因此不再需要ExternalProject。