我只想确保我对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创建构建过程。这是我的第一次尝试,所以我假设有一些错误。这是可行的,但我不确定我是否正确地理解了一切,如果你能与我分享一些意见/建议,我将非常感激。
虚拟/CMakeLists.txt
cmake_minimum_required (VERSION 2.8.11)
project (SUB)
add_subdirectory (src)
add_subdirectory (tests)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)tests/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)提前谢谢你。我已经阅读了大量的网站/教程,但我仍然不确定。
还有一件事--我无法想象有大量源文件的项目。难道没有比手动列出源文件更好的方法向add_library和add_executable函数添加源文件吗?比如“从当前目录中获取所有*.cpp文件”?
谢谢。
发布于 2015-09-20 11:55:03
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++文件有不同扩展名的唯一原因,因为全局,如果您想要排除某个文件,您必须更改它的扩展名( cc、c++、cxx或您喜欢的什么)。
大多数情况下,您可以按照相同的模式执行任何操作,请注意,使用GLOB必须重新配置CMake以检测新添加的文件,但是仍然比手动添加它们来构建脚本更好(而且无论如何,这不会导致整个重新编译,CMake会跟踪数据并避免重新编译旧文件)。
有些人发现手动将文件添加到CMake脚本中很有用,因为“我可以将旧文件保存在那里”。不要这样做,将旧文件移到“旧”文件夹中,或者让您的subversion系统为您保存它们的内存。您将在前面捕获大多数错误,并且您将有一个“准备就绪”的项目(您不会意外地离开用户将试图编译的错误文件)。
另一个要点: Do out of source builds,从您的脚本来看,我想您仍然没有这样做。
https://stackoverflow.com/questions/32676262
复制相似问题