【发布时间】: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)
- cmake_minimum_required 不言自明,
- project (SUB) 设置项目变量,如 ${SUB_SOURCE_DIR} 和 ${SUB_BINARY_DIR},
- 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)
- add_library,从两个源文件创建名为“Sub”的库,
- target_include_directories,告诉编译器“Sub”库的头文件在哪里(这里真的需要“PUBLIC”吗?),
- add_executable,从 Converter.cpp 创建“转换器”可执行文件(为什么这里不需要 main.cpp?),
- 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)
- set (GMOCK_DIR ...),用我的 gmock 文件夹位置设置局部变量“GMOCK_DIR”,
- add_subdirectory,告诉 CMake 跳转到 gmock 位置并运行他们的 CMakeLists.txt,第二个参数是什么? {CMAKE_BINARY_DIR}/gmock?
- add_executable,创建第二个可执行文件
- 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}