库文件
生成库文件
在 CMake 中,要生成库文件可以使用 add_library
命令。具体步骤如下:
-
在 CMakeLists.txt 中使用
add_library
命令定义库文件,如:add_library(mylib SHARED mylib.cpp)
其中,
mylib
是库文件的名称,SHARED
表示生成的库文件为动态链接库(也可以用STATIC
生成静态库),mylib.cpp
是库文件的源代码文件。静态库和动态库都是在编译时链接到程序中使用的库文件,它们的主要区别在于链接的时机和加载方式。
静态库(Static Library)在程序编译时被链接到目标程序中,并成为目标程序的一部分,因此在程序运行时无需再加载该库。静态库的优点是在程序运行时不需要再加载库文件,因此执行速度相对较快,缺点是会增加目标程序的大小,且静态库的更新需要重新编译程序。
动态库(Dynamic Library)则在程序运行时被加载到内存中,因此可以在程序运行时更新,但是也需要依赖动态库文件。动态库的优点是可以被多个程序共享,从而减少内存占用,缺点是执行速度相对较慢。
在使用静态库时,需要在编译时指定链接静态库的命令,而在使用动态库时,需要在程序运行时动态加载库文件。通常情况下,操作系统和大多数编程语言都支持使用静态库和动态库。
-
在 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
表示该链接库将传递给库文件的用户。 -
在 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_INCLUDEDIR
和BOOST_LIBRARYDIR
指定的路径; - CMake 变量
Boost_NO_SYSTEM_PATHS
为FALSE
时,在系统默认路径中查找; - CMake 变量
Boost_NO_SYSTEM_PATHS
为TRUE
时,只在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()
命令将库链接到整个项目中的所有目标文件中。