我只是想确保我对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)
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)
# 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)
还有一件事--我真的无法想象有大量源文件的项目。难道没有比手动列出更好的方法将源文件添加到add_library和add_executable函数中吗?比如“从当前目录中取出所有*.cpp文件”?
谢了。
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,如果您想排除某些文件,您必须更改其扩展名(改为CC
、C++
、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?