【问题标题】:CMake with gmock使用 gmock 进行 CMake
【发布时间】:2015-12-17 00:49:04
【问题描述】:

我只是想确保我对 CMakeLists.txt 的理解是正确的。我的虚拟项目结构:

|-+ dummy
|-+ CMakeLists.txt
    |-+ src
        |-- CMakeLists.txt
        |-- Converter.cpp
        |-- Converter.hpp
        |-- main.cpp
    |-+ tests
        |-- CMakeLists.txt
        |-- Converter_ut.cpp
    |-+ thirdparty
        |-+ gmock-1.7.0

我的目标是使用 CMake 创建构建过程。这是我的第一次尝试,所以我认为有一些错误。它有效,但我不确定我是否正确理解所有内容,如果您能分享一些 cmets / 建议,我将不胜感激。

dummy/CMakeLists.txt

cmake_minimum_required (VERSION 2.8.11)
project (SUB)

add_subdirectory (src)
add_subdirectory (tests)
  1. cmake_minimum_required 不言自明,
  2. project (SUB) 设置项目变量,如 ${SUB_SOURCE_DIR}${SUB_BINARY_DIR}
  3. add_subdirectory,告诉CMake去处理以下目录中的CMakeLists.txt

src/CMakeLists.txt

add_library (Sub
    main.cpp
    Converter.cpp)

target_include_directories (Sub PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

# Executable
add_executable (converter
    Converter.cpp)

target_link_libraries (converter Sub)
  1. add_library,从两个源文件创建名为“Sub”的库,
  2. target_include_directories,告诉编译器“Sub”库的头文件在哪里(这里真的需要“PUBLIC”吗?),
  3. add_executable,从 Converter.cpp 创建“转换器”可执行文件(为什么这里不需要 main.cpp?),
  4. target_link_libraries,将“Sub”库与“converter”可执行文件链接

测试/CMakeLists.txt

# GMOCK
set (GMOCK_DIR "../thirdparty/gmock-1.7.0")
add_subdirectory(${GMOCK_DIR} ${CMAKE_BINARY_DIR}/gmock)
include_directories(SYSTEM ${GMOCK_DIR}/include ${GMOCK_DIR}/gtest/include)

# Executable
add_executable (tests
    Converter_ut.cpp)

target_link_libraries (tests gmock_main Sub)
  1. set (GMOCK_DIR ...),用我的 gmock 文件夹位置设置局部变量“GMOCK_DIR”,
  2. add_subdirectory,告诉 CMake 跳转到 gmock 位置并运行他们的 CMakeLists.txt,第二个参数是什么? {CMAKE_BINARY_DIR}/gmock?
  3. add_executable,创建第二个可执行文件
  4. target_link_libraries,将 gmock_main 库与第二个可执行文件链接,此处需要“Sub”库,因为 Converter_ut.cpp 需要包含来自 src 目录的“Converter.hpp”

提前谢谢你。我已经阅读了很多网站/教程,但我仍然不确定。

还有一件事——我真的无法想象有大量源文件的项目。没有比手动列出更好的方法将源文件添加到 add_library 和 add_executable 函数吗?像“从当前目录中获取所有 *.cpp 文件”之类的东西?

谢谢。

【问题讨论】:

  • 您可以使用通配符来添加文件,但这通常是个坏主意。此外,您永远不应该将您的项目命名为与您的目标相同。如果您使用 Eclipse IDE,您会明白为什么。包含${CMAKE_BINARY_DIR}/gmock,我认为这是一个错误,如果您需要包含生成的标头,您通常会包含${CMAKE_CURRENT_BINARY_DIR}

标签: c++ cmake


【解决方案1】:

Cmake 不是一种支持完整范例的编程语言,因此请使用它,但如果可能的话,永远不要开始创建“带有它的框架”(如果没有适当的语法糖会很麻烦),它的目的是使小脚本不编写数千行代码(尽管很少有好的框架存在,但我倾向于不使用它们:“如果我不能在几行代码中编写代码,那么它就不是 CMAKE 的工作”)。

重要的部分是(并不是说有点不同,我复制粘贴了改进的版本我仍然必须提交):

cmake_minimum_required( VERSION 2.8)
project( Infectorpp2)

# find additional cmake scripts (I'm driving away from this)
set( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

# create list of files from a glob
file( GLOB INFECTOR_SOURCE_FILES
                        "include/Infectorpp/priv/*.cpp")

# create list of files from a glob
file( GLOB INFECTOR_HEADER_FILES
                        "include/Infectorpp/priv/*.hpp"
                        "include/Infectorpp/*.hpp")

# or just "add_executable" the dollar "${}" just expand the list
add_library( libInfectorpp2 STATIC
                        ${INFECTOR_SOURCE_FILES}
                        ${INFECTOR_HEADER_FILES})

如果您不使用第 3 方库,则无需添加 target_include_directories,因为您自己的应用程序相对路径就足够了。

对于测试部分,您对我基本没问题,但我会这样做:

enable_testing()

## details omitted...

 # create list of files from a glob
file( GLOB GMOCK_TESTS_SOURCE_FILES
                        "locationToTestFiles/*.cpp")

# Executable
add_executable (tests
    ${GMOCK_TESTS_SOURCE_FILES})
target_link_libraries (tests gmock_main Sub)

add_test(tests tests)

还请注意,CMAKE 是我发现 C++ 文件具有不同扩展名有用的唯一原因,因为 GLOBS,如果您想排除某些文件,您必须更改其扩展名(更改为 ccc++、@ 987654327@ 或您喜欢的)。

您几乎可以按照相同的模式做任何事情,请注意,使用 GLOB 您必须重新配置 CMake 以检测新添加的文件,但仍然比手动添加它们来构建脚本更好(无论如何这不会导致整个重新编译, CMake 跟踪数据并避免重新编译旧文件)

有些人发现手动向 CMake 脚本添加文件很有用,因为“我可以将旧文件保留在那里”。不要这样做,将旧文件移动到“旧”文件夹中,或者只是让您的颠覆系统为您保留它们的记忆。 您将更早发现大多数错误,并且您将拥有一个“准备发布”的项目(您不会意外留下用户将尝试编译的错误文件)

另一个重点:out of source builds,从你的脚本我猜你还没有这样做。

【讨论】:

  • 实际上我正在从“build”目录运行 cmake。我没有在我的帖子中列出这个文件夹以使其更简单。谢谢您的回答。你能解释一下“测试部分”的变化吗? “enable_testing()”到底是做什么的?和“add_test”?谢谢!
  • 我自己检查过——为了将来参考,enable_testing() 和 add_test() 允许通过 ctest 运行测试。
  • 是的,ctest 可能很有用,我永远无法充分发挥它的潜力,但是如果没有害处,为什么不在 ctest 中进行测试呢? ;)。如果答案足够,不要忘记接受:)
  • @CoffeDeveloper 指向您的项目的链接不再有效
  • 无论如何都在答案中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2014-02-09
  • 2013-01-24
  • 2011-07-07
相关资源
最近更新 更多