Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 验证我对CMakeLists.txt文件的理解_C++_Cmake - Fatal编程技术网

C++ 验证我对CMakeLists.txt文件的理解

C++ 验证我对CMakeLists.txt文件的理解,c++,cmake,C++,Cmake,我成功地使用了CMakeLists.txt文件进行了试错,现在一切都建立起来了。然而,我想确保我对它的工作原理的理解是正确的 我有一个具有以下结构的项目: ./ ├── bin ├── CMakeLists.txt ├── include │   └── sql-writer │   ├── credentials.h │   ├── database.h │   ├── datetime.h │   ├── market_bar.h │   └── wr

我成功地使用了
CMakeLists.txt
文件进行了试错,现在一切都建立起来了。然而,我想确保我对它的工作原理的理解是正确的

我有一个具有以下结构的项目:

./
├── bin
├── CMakeLists.txt
├── include
│   └── sql-writer
│       ├── credentials.h
│       ├── database.h
│       ├── datetime.h
│       ├── market_bar.h
│       └── writer.h
├── README.md
├── src
│   ├── CMakeLists.txt
│   ├── database.cpp
│   ├── main.cpp
│   └── writer.cpp
└── test
    ├── CMakeLists.txt
    ├── test-main.cpp
    ├── test_sym_table_pairs
    └── writer_tests.cpp
这将构建一个可执行文件、一个静态库和一个测试可执行文件。问题是
src/CMakeLists.txt

set(HEADER_DIR ${sql-writer_SOURCE_DIR}/include/sql-writer)

add_executable(sql-writer-demo main.cpp ${HEADER_DIR})
target_include_directories(sql-writer-demo PUBLIC ${HEADER_DIR}) #!
target_link_libraries(sql-writer-demo sql-writer-lib mysqlcppconn ${Boost_LIBRARIES})

file(GLOB SOURCES ${sql-writer_SOURCE_DIR}/src/*.cpp)
file(GLOB HEADERS ${HEADER_DIR}/*.h)
add_library(sql-writer-lib ${HEADERS} ${SOURCES})
target_link_libraries(sql-writer-lib mysqlcppconn ${Boost_LIBRARIES})
target_include_directories(sql-writer-lib PUBLIC ${HEADER_DIR})
  • 第一行的
    set
    命令只定义
    HEADER\u DIR
    。这很容易

  • target\u include\u目录(sql writer demo PUBLIC${HEADER\u DIR})
    必须包含在第一个
    add\u execuable
    之后,否则头文件需要包含在相对路径中。是这样吗?为什么之后会发生?我听说cmake将目录视为与“源”(cmake源文件不是.cpp文件)分开的。这是什么意思

  • target\u link\u库(sql writer demo sql writer lib mysqlcppcconn${Boost\u libraries})
    需要在
    add\u可执行文件(sql writer demo main.cpp${HEADER\u DIR})
    之后,它告诉我们如何链接到其他库

  • 文件(GLOB SOURCES${sql-writer\u SOURCE\u DIR}/src/*.cpp)
    之前不建议使用,因为目录/文件结构可能会发生更改,这样就不起作用了

  • target\u link\u库(sql writer lib mysqlcppcconn${Boost\u libraries})
    需要在
    add\u库(sql writer lib${HEADERS}${SOURCES})
    之后进行,因为我的库
    sql writer lib
    的计算需要使用其他lib,这就是我们告诉cmake注意的地方

    • 通常情况下,您不会在
      add_executable
      add_library
      中包含头文件,而只包含实现文件:

      添加可执行文件(SQLWriter demo main.cpp) 添加库(sql编写器库${SOURCES})
    • add_executable
      add_library
      创建目标,
      target_include_目录
      指定此目标的include目录。委员会:

      命名的
      必须是通过
      add\u executable()
      add\u library()
      等命令创建的,并且不能是导入的
      目标

    • 如果将
      target\u include\u目录(sql writer lib PUBLIC${HEADER\u DIR})
      PUBLIC
      说明符一起使用,则无需使用
      target\u include\u目录
      为链接到该库的目标指定包含目录,因为依赖关系将自动传播。这同样适用于
      目标链接库

    所以,
    src/CMakeLists.txt

    文件(GLOB SOURCES${sql-writer\u SOURCE\u DIR}/src/*.cpp)
    添加库(sql编写器库${SOURCES})
    目标链接库(sql编写器库公共mysqlcppcconn${Boost\u库})
    目标目录(sql编写器lib PUBLIC${HEADER\u DIR})
    添加可执行文件(SQLWriter demo main.cpp)
    目标链接库(sql编写器演示sql编写器库)
    

    应该有用。是否要在
    mysqlcppconn${Boost_LIBRARIES}
    上使用
    PUBLIC
    ,取决于项目的结构。我只把它作为一个例子。

    单个问题帖子中的问题太多了。请专注于一个问题,并确保在提问前进行搜索<代码>目标*
    命令对作为第一个参数传递的目标进行操作。因此,这些命令应该在定义了目标之后发出,@Tsyvarev在相同的上下文中,将这些命令分为不同的问题是没有意义的。我觉得这篇文章不错。@Soleil:上下文很小,所以这不是不单独提问的理由。此外,对于某些问题,可以由作者或熟悉该领域的编辑进一步简化上下文。理解include目录是一个相当大的主题,所以没有必要将它与库链接结合起来。如果第4点是一个问题,那么答案如下:。为什么我们要重复这些答案?