关于CMakeLists.txt的一些记录

42 阅读3分钟

库文件

生成库文件

在 CMake 中,要生成库文件可以使用 add_library 命令。具体步骤如下:

  1. 在 CMakeLists.txt 中使用 add_library 命令定义库文件,如:

    add_library(mylib SHARED mylib.cpp)
    

    其中,mylib 是库文件的名称,SHARED 表示生成的库文件为动态链接库(也可以用 STATIC 生成静态库),mylib.cpp 是库文件的源代码文件。

    静态库和动态库都是在编译时链接到程序中使用的库文件,它们的主要区别在于链接的时机和加载方式。

    静态库(Static Library)在程序编译时被链接到目标程序中,并成为目标程序的一部分,因此在程序运行时无需再加载该库。静态库的优点是在程序运行时不需要再加载库文件,因此执行速度相对较快,缺点是会增加目标程序的大小,且静态库的更新需要重新编译程序。

    动态库(Dynamic Library)则在程序运行时被加载到内存中,因此可以在程序运行时更新,但是也需要依赖动态库文件。动态库的优点是可以被多个程序共享,从而减少内存占用,缺点是执行速度相对较慢。

    在使用静态库时,需要在编译时指定链接静态库的命令,而在使用动态库时,需要在程序运行时动态加载库文件。通常情况下,操作系统和大多数编程语言都支持使用静态库和动态库。

  2. 在 CMakeLists.txt 中设置库文件的包含目录和链接库。例如:

    target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
    target_link_libraries(mylib PUBLIC ${Boost_LIBRARIES})
    

    其中,target_include_directories 设置库文件的包含目录,PUBLIC 表示该设置将应用于库文件的用户和库文件本身;target_link_libraries 设置库文件的链接库,PUBLIC 表示该链接库将传递给库文件的用户。

  3. 在 CMake 中执行 build 命令生成库文件。

    shellCopy code
    $ mkdir build && cd build
    $ cmake ..
    $ cmake --build .
    

    在执行 cmake --build . 命令后,库文件将生成在 build 目录中的默认位置。可以通过修改 CMAKE_LIBRARY_OUTPUT_DIRECTORY 变量来指定库文件的生成目录。

添加库文件

  • 库文件所在目录
  • 库文件的名称
  • 外部库

link_libraries() 命令会将指定的库链接到目标文件中,但是它不会告诉编译器库的实际位置。编译器在链接库时,需要知道库文件的实际路径。

通常情况下,CMake 会在系统的默认库路径中搜索库文件。这些默认路径通常包括 /usr/lib/usr/local/lib/usr/lib64 等。如果库文件位于这些默认路径中,则编译器可以找到它们并将它们链接到目标文件中。

如果库文件不在默认路径中,您可以使用 link_directories() 命令告诉编译器查找库文件的实际路径。例如,如果库文件 "alglogger" 位于 /path/to/libs 目录中,您可以使用以下命令告诉编译器查找该文件:

link_directories(/path/to/libs)

在这之后,您可以使用 link_libraries() 命令将该库链接到目标文件中。

另外,如果您使用的是外部库(例如 Boost、OpenCV 等),您可以使用 find_package() 命令查找这些库。该命令会自动查找库文件的位置,并将其链接到目标文件中。例如,如果您想链接 Boost 库,可以使用以下命令:

find_package(Boost REQUIRED)
target_link_libraries(myapp ${Boost_LIBRARIES})

这个命令会查找 Boost 库文件的位置,并将其链接到 myapp 目标文件中。

如关于Qt库的使用

find_package(Qt5 REQUIRED Widgets)
find_package(Qt5 REQUIRED Core)
find_package(Qt5 REQUIRED Gui)
find_package(Qt5 REQUIRED Charts)
target_link_libraries(myapp Qt5::Widgets Qt5::Gui Qt5::Core Qt5::Charts)

find_package(Boost REQUIRED) 会在系统中查找 Boost 库,并添加其包含路径和库路径到 CMake 构建系统中。

具体来说,CMake 会在以下路径中查找 Boost 库:

  • 环境变量 BOOST_ROOT 指定的路径;
  • 环境变量 BOOST_INCLUDEDIRBOOST_LIBRARYDIR 指定的路径;
  • CMake 变量 Boost_NO_SYSTEM_PATHSFALSE 时,在系统默认路径中查找;
  • CMake 变量 Boost_NO_SYSTEM_PATHSTRUE 时,只在 BOOST_ROOT 指定的路径中查找。

如果找到 Boost 库,则会设置 CMake 变量 Boost_INCLUDE_DIRS 为 Boost 头文件的路径,变量 Boost_LIBRARY_DIRS 为 Boost 库文件的路径。REQUIRED 参数告诉 CMake 如果找不到 Boost 库,则停止构建过程并报错。如果您不想停止构建过程,可以省略 REQUIRED 参数,这将允许您在没有 Boost 库的情况下继续构建过程,但在链接时可能会出现错误。

在使用 target_link_libraries() 命令时,不需要使用 link_directories() 命令指定库文件的目录,因为 CMake 会自动在系统默认的库路径中搜索库文件。如果库文件不在默认路径中,您可以使用 find_library() 命令查找库文件的位置,并使用 target_link_libraries() 命令将其链接到目标文件中。例如:

find_library(ALGLOGGER_LIBRARY NAMES alglogger PATHS /path/to/libs)
target_link_libraries(your_target_name PRIVATE ${ALGLOGGER_LIBRARY})

其中,ALGLOGGER_LIBRARY 是查找到的库文件路径。这里使用了 PATHS 参数来指定要搜索的路径,如果库文件位于多个路径中,您可以使用多个 PATHS 参数。

在使用 target_link_libraries() 命令时,PRIVATE 关键字指示链接库时仅将其链接到目标文件中,而不会将其链接到依赖该目标文件的其他目标文件中。如果您希望将库链接到所有依赖于目标文件的其他目标文件中,可以使用 PUBLIC 关键字。

请注意,使用 target_link_libraries() 命令将库链接到目标文件中通常比使用 link_libraries() 命令更可取。这是因为 target_link_libraries() 命令允许您将库链接到特定目标文件中,而 link_libraries() 命令将库链接到整个项目中的所有目标文件中。