我只是想确保我对 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
Run Code Online (Sandbox Code Playgroud)
我的目标是使用 CMake 创建构建过程。这是我的第一次尝试,所以我认为有一些错误。它有效,但我不确定我是否正确理解所有内容,如果您能分享一些评论/建议,我将不胜感激。
cmake_minimum_required (VERSION 2.8.11)
project (SUB)
add_subdirectory (src)
add_subdirectory (tests)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
# 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)
Run Code Online (Sandbox Code Playgroud)
先感谢您。我已经阅读了很多网站/教程,但我仍然不确定。
还有一件事 - 我无法想象有大量源文件的项目。没有比手动列出更好的方法将源文件添加到 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})
Run Code Online (Sandbox Code Playgroud)
如果您不使用第 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)
Run Code Online (Sandbox Code Playgroud)
另请注意,CMAKE 是我发现 C++ 文件具有不同扩展名有用的唯一原因,因为 GLOBS,如果您想排除某些文件,则必须更改其扩展名(更改为cc、c++或cxx您喜欢的扩展名)。
您几乎可以按照相同的模式执行任何操作,请注意,使用 GLOB 您必须重新配置 CMake 来检测新添加的文件,但是仍然比手动添加它们来构建脚本更好(无论如何,这不会导致整个重新编译,CMake 保留跟踪数据并避免重新编译旧文件)
有些人发现手动将文件添加到 CMake 脚本很有用,因为“我可以将旧文件保留在那里”。不要这样做,将旧文件移到“旧”文件夹中,或者只是让你的颠覆系统为你保留它们的记忆。您将更早地发现大多数错误,并且您将拥有一个“准备交付”的项目(您不会意外留下用户尝试编译的错误文件)
另一个重要的点:从你的脚本中 进行源代码构建,我猜你仍然没有这样做。
| 归档时间: |
|
| 查看次数: |
13384 次 |
| 最近记录: |