当前位置: 首页 > 知识库问答 >
问题:

带gmock的CMake

孔宇
2023-03-14

我只是想确保我对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_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
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创建“converter”可执行文件(为什么这里不需要main.cpp?),
  4. target_link_libraries,将“sub”库与“converter”可执行文件链接
# 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. 设置(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文件”?

谢了。

共有1个答案

燕俊明
2023-03-14

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})

如果不使用第三方库,则不需要添加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++Cxx或您喜欢的扩展名)。

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

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

另一个重要的点:从源代码中构建,从脚本中我猜你还没有这样做。

 类似资料:
  • Gmock是一个基于Groovy语言的mock框架。Gmock利用了Groovy语言的特性,提供了简洁可读的语法,并且用Gmock mock出来的对象可以在Java代码中使用,所以你可以使用Java编写代码而使用Groovy和Gmock编写测试。

  • 我有一个报告,我想在其中显示页脚,但不想显示页眉部分-在摘要带。我可以通过选中“带有页眉和页脚的摘要”来显示两者或不显示。

  • 现在我的问题是,如何在自定义的而不是自定义的中重写方法?我没有在这里公布我的代码,因为它与链接的代码本质上是相同的,只是我需要为子创建一个自定义的来代替,这样它就可以按照“pptang”的答案所述进行正确的度量。 否则,有没有比在第二个RecyclerView中使用1个RecyclerView更好的方法?只能有1个RecyclerView使用上述列表和每个中唯一项的网格填充活动/片段吗?

  • 2)如果困境是真的,为什么事情要这样设置?谷歌计划反对TabHost和基于标签的多活动方法吗?多活动方法有什么不愉快的地方吗? 3)如果继续支持这两种方法,它们的优缺点是什么?如果我使用ActionBar+片段,我会遇到任何困难吗?例如,当我想让我的一个选项卡屏幕滑过/弹出一个额外的屏幕/片段时,我会不会在ActionBar中切换到/从选项卡中切换到选项卡?

  • 问题内容: 之间有什么区别 和 我都尝试过,但似乎都可以,但是我是在问,以防万一我需要小心(例如,%以外的单位等)。 问题答案: 这完全是关于HTML标记的真实有效性。这是W3C(WWW联盟)的工作目的。许多事情可能都在HTML中起作用,但是必须进行验证才能被网络浏览器更仔细地识别。您甚至可以在开头和结尾处省略and 标记,但是完全不建议这样做,没有人这样做,它被视为“错误代码”。 因此,将它们放

  • 根据Spring网站上的这个教程,我知道了如何使用Stomp和Spring4建立一个基于WebSocket的应用程序。在客户端,我们有: 在服务器端,控制器中有以下内容: 现在,我明白了确保如果消息发送到目标,那么将调用方法。由于订阅了,将消息发送回。 那么,有什么方法可以用Spring4、SockJS和没有跺脚的情况下做到这一点呢?还是Spring4WebSocket只支持stomp?