【问题标题】:How to set up a CMake project correctly?如何正确设置 CMake 项目?
【发布时间】:2014-09-09 07:59:16
【问题描述】:

虽然很容易找到有关如何使用 CMake 的表面信息,但如何正确使用 CMake 的信息似乎很难找到。在一个大小适中的 CMake 项目(一个可执行文件、该可执行文件使用的一个或多个静态库、静态库使用的一个或多个外部依赖项)中,文件夹和 CMakeList.txt 文件应该如何排序?哪些 CMakeList.txt 文件应该有哪些命令?

【问题讨论】:

  • 你读过 cmake 网站上的 Wiki cmake.org/Wiki/CMake 吗?
  • @SergeiNikulov 引用:You are now on the CMake wiki. Many pages are now DEPRECATED and sometimes even considered bad practice. Those are only kept as reference for previous CMake versions.

标签: c++ cmake


【解决方案1】:

了解如何有效使用 CMake 的一个好方法是查看其他项目。 LLVM 及其子项目就是一个很好的例子。

一般来说,良好的编码实践会转化为良好的 CMake 实践;你想要模块化、清晰的风格和灵活性。

这方面的一个例子可能是在src 目录中构建可执行文件的规则,然后在根项目文件夹中使用该目标。像这样的:

-my_proj
|
----CMakeLists.txt //contains directives for top-level dependencies and linking, includes subfolders
----src
    |
    ----CMakeLists.txt //contains definition of your main executable target
    ----internal_lib
        |
        ----CMakeLists.txt //contains definition of your internal static libraries

my_proj/CMakeLists.txt

add_subdirectory(src)
find_package (Threads REQUIRED) #find pthreads package
target_link_libraries (my_exe my_lib ${CMAKE_THREAD_LIBS_INIT}) #link against pthreads and my_lib

my_proj/src/CMakeLists.txt

add_subdirectory(internal_lib)
add_executable(my_exe my_source1.cpp mysource2.cpp)

my_proj/src/internal_lib/CMakeLists.txt

add_library(my_lib my_lib_source1.cpp my_lib_source2.cpp)

【讨论】:

  • 您能否提供一个非常简单的示例来说明这些 CMakeLists.txt 文件的外观?
  • @ruslo,一个公平的观点,但它们的评论相当不错,并展示了广泛的功能的使用,这比我对许多其他示例所能说的要多。此外,随着目录结构的下降,CMakeLists 会变得更简单;例如,我希望任何人都能理解用于构建内部静态库的文件。
【解决方案2】:

我希望this tutorial 正是您从一个简单项目的 CMake 配置开始所需要的,包括一个可执行文件和多个库 - 看看吧!无论如何,我发现 CMake by Example 是学习 CMake 最简单的方法:

将 CMake 与可执行文件结合使用

add_executable(myapp main.c)

将 CMake 与静态库结合使用

add_library(test STATIC test.c)

将 CMake 与动态库结合使用

add_library(test SHARED test.c)

使用 CMake 将库链接到可执行文件

add_subdirectory(libtest_project) 

add_executable(myapp main.c)

target_link_libraries(myapp test)

【讨论】:

  • 如果您有兴趣可以稍微改进本教程,请使用:cmake -H. -B_builds 来构建项目(而不是 mkdir _builds && cd _builds && cmake ..)。 makemake install 仅适用于 makefile,您可以将 cmake --build _buildscmake --build _builds --target install 用于任何类型的生成器。此外,当您像这样使用ExternalProject_Add 时,您不能使用find_package 模块。
猜你喜欢
  • 2016-09-17
  • 2018-08-25
  • 1970-01-01
  • 2018-11-03
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
相关资源
最近更新 更多