CMake必须使用的命令

CMake常用命令汇总

include_directories - 向工程添加多个特定的头文件搜索路径 —>相当于指定g++编译器的-I参数
上面把add.h移动到inc目录下后, gcc就找不到add.h了, 所以报错。 此时,要利用-I来显式指定头文件的所在地, -I就是用来干这个的:告诉gcc去哪里找头文件。

link_directories - 向工程添加多个特定的库文件搜索路径

link_directories(directory1 [directory2 ...])

其中,directory1directory2 等参数是要添加到链接路径中的库目录的路径。可以通过传递多个参数来添加多个库目录。
使用 link_directories 命令需要注意以下几点:

  • 应该避免使用该命令来添加系统库目录,而应该使用 find_package 命令或 target_link_libraries 命令来链接系统库。
  • 应该在 add_executableadd_library 命令之前调用 link_directories 命令,否则添加的链接路径可能会被忽略。

以下是一个简单的示例,演示了如何使用 link_directories 命令添加一个库目录:

link_directories(/usr/local/lib)
add_executable(my_app main.cpp)
target_link_libraries(my_app my_lib)

在这个示例中,link_directories 命令将 /usr/local/lib 目录添加到链接路径中。然后,add_executable 命令创建一个名为 my_app 的可执行文件,并使用 target_link_libraries 命令将名为 my_lib 的库链接到该可执行文件中。CMake 将在 /usr/local/lib 目录中查找名为 my_lib 的库文件来完成链接过程。

add_library - 生成库文件

add_library(my_lib STATIC my_lib.cpp my_header.h)

此命令创建一个名为 my_lib 的新库目标,它是一个静态库,并编译源文件 my_lib.cppmy_header.h 以创建库。一旦定义了库目标,其他的 CMake 目标可以依赖它并使用 target_link_libraries 命令链接到它。
add_library扩展
在 CMake 中构建库文件需要源代码文件和 CMakeLists.txt 文件。源代码文件是构建库文件的实际代码文件,通常包括 .cpp、.c 和 .h 文件。CMakeLists.txt 文件包含指定库文件构建过程的 CMake 命令和选项。以下是一个简单的示例 CMakeLists.txt 文件:

# 指定库文件名称和源代码文件
add_library(my_lib my_source.cpp my_header.h)

# 指定库文件类型为静态库
set_target_properties(my_lib PROPERTIES
    OUTPUT_NAME "my_lib"
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
)

# 添加库文件需要的其他依赖项
target_link_libraries(my_lib PUBLIC other_lib)

这个示例中,add_library 命令指定了库文件名称和源代码文件。set_target_properties 命令指定了库文件类型为静态库,并设置了输出名称和输出路径。target_link_libraries 命令添加了其他库文件的依赖项。
库文件的后缀取决于库的类型和操作系统。在 Windows 上,静态库的后缀通常是 .lib,而共享库的后缀通常是 .dll。在 Linux 和 macOS 上,静态库的后缀通常是 .a,而共享库的后缀通常是 .so。但是,这些后缀并不是硬性规定,可以根据需要进行更改。
在 CMake 中,您可以使用 set_target_properties 命令来指定库的输出名称和输出路径。例如,以下命令将输出名称设置为 my_lib,将静态库的输出路径设置为 ${CMAKE_BINARY_DIR}/lib

set_target_properties(my_lib PROPERTIES
    OUTPUT_NAME "my_lib"
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
)

这将使 CMake 生成一个名为 libmy_lib.a 的静态库文件,保存在 ${CMAKE_BINARY_DIR}/lib 目录下。如果要生成共享库文件,则可以使用 SHARED 参数。例如,以下命令将生成一个名为 libmy_lib.so 的共享库文件:

add_library(my_lib SHARED my_source.cpp my_header.h)

add_compile_options - 添加编译参数**

  • -g: 生成调试信息。
  • -O0, -O1, -O2, -O3: 设置优化级别。
  • -Wall, -Wextra, -Werror: 开启警告级别。
  • -std=c++11, -std=c++14, -std=c++17: 指定使用的 C++ 标准版本。
  • -pthread: 启用 POSIX 线程支持。
  • -fPIC: 生成位置无关的代码。
  • -shared: 生成共享库。
  • -Wl,–no-as-needed: 防止链接时自动剔除未使用的库。

target_link_libraries - 为 target 添加需要链接的共享库—>相同于指定g++编译器-l参数
target_link_libraries(target_name library_name1 library_name2 …)
其中,target_name 是目标文件的名称,library_name1、library_name2 等是需要链接的库文件的名称。
target_link_libraries 命令的作用包括以下几个方面:

  1. 链接库文件:将指定的库文件链接到目标文件中,使得目标文件可以使用这些库中定义的函数和符号。
  2. 解决依赖关系:如果库文件中还依赖于其他库文件,target_link_libraries 命令会自动解析这些依赖关系,并将这些依赖的库文件也链接到目标文件中。
  3. 指定链接顺序:有些库文件需要按照一定的顺序进行链接,否则会出现链接错误。target_link_libraries 命令可以通过调整链接顺序来解决这个问题。
  4. 其他选项:target_link_libraries 命令还支持一些其他选项,例如链接库的搜索路径、链接库时使用的编译选项等等。

函数参数

  1. PRIVATE:指定库文件为目标文件的私有依赖项,意味着该库文件只会链接到目标文件中,不会影响其他目标文件。默认情况下,target_link_libraries 命令会将库文件作为 PUBLIC 依赖项。
  2. PUBLIC:指定库文件为目标文件的公共依赖项,意味着该库文件会链接到目标文件中,并且也会链接到其他目标文件中,以满足对该库文件的依赖关系。
  3. INTERFACE:指定库文件为目标文件的接口依赖项,意味着该库文件只会链接到其他目标文件中,不会链接到目标文件本身。这通常用于在不同的目标文件之间共享公共的库依赖项。
target_link_libraries(my_executable PRIVATE my_library)
target_link_libraries(my_library PUBLIC another_library)
target_link_libraries(another_executable INTERFACE my_library)

add_subirectory命令
add_subdirectory
是 CMake 中的一个命令,用于向 CMake 构建系统添加一个子目录。
当在一个 CMake 项目中需要构建多个子目录时,可以使用 add_subdirectory 命令将这些子目录添加到构建系统中,以便能够在整个项目中对它们进行编译和链接。
add_subdirectory 命令需要传递一个参数,该参数指定子目录的路径。例如,如果我们有一个名为 “subdir” 的子目录,我们可以使用以下命令将其添加到 CMake 项目中:

add_subdirectory(subdir)

在执行 add_subdirectory 命令后,CMake 将进入指定的子目录,并执行子目录中的 CMakeLists.txt 文件,以便为该子目录生成一个单独的构建系统。这个构建系统可以使用和父目录不同的编译选项、链接选项和安装规则等。
子目录可以使用父目录中定义的变量。在子目录的 CMakeLists.txt 文件中,可以使用 set() 命令或 ${} 语法来引用父目录中的变量。例如:

set(SUBDIR_VAR ${PARENT_VAR})

这将定义一个名为 SUBDIR_VAR 的变量,并将其设置为父目录中名为 PARENT_VAR 的变量的值。在子目录中,可以使用 SUBDIR_VAR 变量来访问该值。
另外,父目录也可以使用 set() 命令将变量传递给子目录。这可以通过在 add_subdirectory() 命令中指定 PARENT_SCOPE 选项来实现。例如:

set(PARENT_VAR "Hello, world!")
add_subdirectory(subdir)

在子目录的 CMakeLists.txt 文件中,可以使用 ${PARENT_VAR} 语法来引用 PARENT_VAR 变量的值。

message("Parent variable: ${PARENT_VAR}")

注意,PARENT_SCOPE 选项将变量设置为父目录的作用域,因此需要使用 ${} 语法来引用该变量。

aux_source_directory - 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指 令临时被用来自动构建源文件列表
aux_source_directory 是 CMake 中的一个命令,用于向 CMake 构建系统添加一个目录中的所有源文件。
当一个目录中有多个源文件需要添加到 CMake 项目中时,可以使用 aux_source_directory 命令将该目录中的所有源文件添加到构建系统中,以便能够在整个项目中对它们进行编译和链接。
aux_source_directory 命令需要传递两个参数,第一个参数指定源文件所在的目录路径,第二个参数指定一个变量名称,该变量将包含该目录中所有源文件的名称列表。例如,如果我们有一个名为 “src” 的目录,其中包含多个源文件,我们可以使用以下命令将这些源文件添加到 CMake 项目中:

aux_source_directory(src SRC_LIST)

注意,aux_source_directory 命令不会递归地查找目录中的子目录。如果需要添加多个目录中的源文件,可以使用多个 aux_source_directory 命令,或者使用 file(GLOB) 命令来查找并添加文件。同时,由于 aux_source_directory 命令会将指定目录中的所有源文件添加到一个变量中,因此不适合用于大型项目中,可能需要更细粒度的控制来管理源文件的编译和链接。
如果需要向项目中添加一个目录及其子目录中的所有源文件,可以使用 file(GLOB_RECURSE) 命令来递归地查找并添加这些源文件。例如:

file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h")
add_executable(MyApp ${SOURCES})

在这个例子中,file(GLOB_RECURSE) 命令将递归地查找 src 目录及其子目录中所有扩展名为 .cpp.h 的文件,并将它们存储在名为 SOURCES 的变量中。接着,我们使用 add_executable() 命令将这些源文件编译成一个名为 MyApp 的可执行文件。
需要注意的是,递归地查找文件可能会导致构建系统的效率下降,并且可能会引入一些不需要的文件。因此,建议在使用 file(GLOB_RECURSE) 命令时尽量指定明确的文件扩展名和路径,以避免不必要的文件被添加到项目中。如果需要更细粒度的控制,可以使用多个 add_subdirectory() 命令来添加子目录,并在每个子目录中显式地列出需要编译的源文件。

install命令

install(TARGETS <target> [<target>...]
        [[ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE|PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
          [DESTINATION <dir>]
          [PERMISSIONS permissions...]
          [CONFIGURATIONS [Debug|Release|...]]
          [COMPONENT <component>]
          [OPTIONAL]
         ] [...])

其中 是需要安装的目标文件(可执行文件、库等)。在 DESTINATION 参数中指定目标安装目录的路径。如果需要,还可以设置可选参数以控制安装选项,如安装权限、配置、组件和是否为可选组件等。
以下是一个简单的示例,展示如何使用 install 命令将可执行文件 myapp 安装到 /usr/local/bin 目录中:

add_executable(myapp main.cpp)
install(TARGETS myapp DESTINATION /usr/local/bin)

此外,还可以使用 install 命令安装其他类型的文件和目录,例如头文件、配置文件和数据文件等。例如,以下命令将 mylib.h 头文件安装到 /usr/local/include 目录中:

install(FILES mylib.h DESTINATION /usr/local/include)

在 CMake 中,install 命令可以用来将生成的可执行文件、库文件和其他资源文件安装到指定的目录中。RUNTIME_DESTINATION 参数用于指定运行时库文件的目标路径,它适用于共享库文件(.so 文件、.dylib 文件或 .dll 文件等),用于指定这些库文件在安装时应该被复制到哪个目录中。
举个例子,假设我们有一个共享库文件 libexample.so,我们可以使用以下 CMake 命令将它安装到指定的目录:

install(TARGETS example
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib/static)

上述命令将把 libexample.so 安装到 lib 目录下,同时还会将可执行文件安装到 bin 目录下。这里,RUNTIME_DESTINATION 参数用于指定 bin 目录作为运行时库文件的安装目标路径。

CMake常用变量
CMAKE_C_FLAGS gcc编译选项
CMAKE_CXX_FLAGS g++编译选项

在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
set( CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11”)
CMAKE_BUILD_TYPE编译类型(Debug, Release)
设定编译类型为debug,调试时需要选择debug
set(CMAKE_BUILD_TYPE Debug)
设定编译类型为release,发布时需要选择release
set(CMAKE_BUILD_TYPE Release)

CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
_SOURCE_DIR
PROJECT_SOURCE_DIR是CMake内置变量之一,它代表当前项目根目录的路径。当使用project命令指定项目名称时,CMake会自动设置PROJECT_SOURCE_DIR的默认值为项目根目录的路径(CMakeLists.txt所在的路径)。如果你使用的是子目录CMakeLists.txt,那PROJECT_SOURCE_DIR将会是子目录的路径。
这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。

CMAKE_C_COMPILER:指定C编译器
CMAKE_CXX_COMPILER:指定C++编译器
EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径
LIBRARY_OUTPUT_PATH:库文件输出的存放路径

文件类型附图
image.png
image.png

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值