file(GLOB SOURCES "src/*.cpp" "src/*.c")中的GLOB是什么意思?
时间: 2023-07-22 14:58:53 浏览: 93
`GLOB`是CMake的一个文件匹配模式,它用于在给定的路径中匹配文件。在`file(GLOB ...)`命令中,你可以使用通配符(`*`、`?`等)来匹配特定的文件。
具体来说,在`file(GLOB ...)`命令中,你可以指定一个或多个文件路径模式作为参数。CMake将根据这些模式在文件系统中搜索匹配的文件,并将它们存储在一个变量中。
例如,`file(GLOB SOURCES "src/*.cpp")`将匹配`src`目录下的所有`.cpp`文件,并将它们保存在名为`SOURCES`的变量中。
使用`GLOB`模式有一些注意事项:
1. `GLOB`模式是基于文件系统进行匹配的,因此它可能无法检测到在构建期间添加或删除的文件。因此,在向项目添加新文件或从项目中删除文件时,最好手动更新CMakeLists.txt文件,以确保所有文件都被正确地包含或排除。
2. 在较大的项目中,使用`GLOB`模式可能会导致性能问题,因为每次调用CMake时都会重新搜索文件。如果你的项目较大且文件频繁变动,最好手动列出所有源文件,以确保正确性和性能。
总体而言,尽管可以使用`GLOB`模式来方便地添加多个源文件,但在实际使用中需要注意更新文件列表以确保准确性和可靠性。
相关问题
add_executable支持/**/格式吗?
在CMake的`add_executable`命令中,不能直接使用`/**/`格式来递归搜索目录。
CMake并不直接支持递归搜索目录,因此无法在`add_executable`命令中使用类似于`/**/`的模式来匹配多级子目录下的文件。
要添加多级子目录中的源文件,你有几种选择:
1. 显式列出所有的源文件:手动列出每个子目录中的源文件,并将它们添加到`add_executable`命令中。例如:
```cmake
add_executable(my_project
src/main.cpp
src/utils.cpp
src/math.cpp
src/subdir1/file1.cpp
src/subdir2/file2.cpp
...
)
```
2. 使用CMake的`file(GLOB ...)`命令:你可以使用`file(GLOB ...)`命令来匹配特定目录下的文件,并将它们添加到`add_executable`命令中。例如:
```cmake
file(GLOB SOURCES
"src/*.cpp"
"src/subdir1/*.cpp"
"src/subdir2/*.cpp"
...
)
add_executable(my_project ${SOURCES})
```
请注意,使用`GLOB`模式存在一些限制和注意事项,如前面所述。
无论你选择哪种方式,都需要确保正确地包含所需的源文件,并在构建期间处理它们。
我现有的目录下有src、include、client、server四个文件夹,依赖/usr/local/lib/libhiredis.so,我希望用src、include生成一个动态库,用server加这个动态库生成一个程序并封装成service,应该怎么写cmakelist.txt,
你可以按照以下方式编写CMakeLists.txt文件:
```
cmake_minimum_required(VERSION 3.5)
project(MyProject)
set(CMAKE_CXX_STANDARD 11)
# 设置头文件路径
include_directories(include)
# 设置源文件路径
file(GLOB SOURCES "src/*.cpp")
# 生成动态库
add_library(MyLibrary SHARED ${SOURCES})
# 链接libhiredis.so库
target_link_libraries(MyLibrary hiredis)
# 生成可执行文件
add_executable(MyServer server/main.cpp)
# 链接MyLibrary库
target_link_libraries(MyServer MyLibrary)
# 将可执行文件封装成service
install(TARGETS MyServer DESTINATION /etc/systemd/system)
```
这个CMakeLists.txt文件假设你的源代码文件都在src文件夹中,头文件在include文件夹中,server的主程序在server/main.cpp中。你需要将libhiredis.so库放在/usr/local/lib/目录下。
你可以使用以下命令来编译和安装程序:
```
mkdir build && cd build
cmake ..
make
sudo make install
```
这将会生成MyLibrary动态库和MyServer可执行文件,并将MyServer封装成service并安装到/etc/systemd/system目录下。