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
中包含头文件,而只包含实现文件: 添加可执行文件(SQLWriter demo main.cpp) 添加库(sql编写器库${SOURCES})add_library
和add_executable
创建目标,add_library
指定此目标的include目录。委员会: 命名的target_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点是一个问题,那么答案如下:。为什么我们要重复这些答案?