[C++][CMake][库]详细讲解

时间:2025-02-13 18:13:11
  • 语法
    target_link_libraries(
        <target> 
        <PRIVATE|PUBLIC|INTERFACE> <item>... 
        [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
    
  • 参数
    • target:指定要加载动态库的文件的名字
      • 该文件可能是一个源文件
      • 该文件可能是一个动态库文件
      • 该文件可能是一个可执行文件
    • PRIVATE|PUBLIC|INTERFACE:动态库的访问权限,默认是PUBLIC
      • 如果各个动态库之间没有依赖关系,无需做任何设置,三者没有没有区别,一般无需指定,使用默认的PUBLIC即可
      • 动态库的链接具有传递性,如果动态库A链接了动态库B、C,动态库D链接了动态库A,此时动态库D相当于也链接了动态库B、C,并可以使用动态库B、C中定义的方法
        target_link_libraries(A B C)
        target_link_libraries(D A)
        
      • PUBLIC:在PUBLIC后面的库会被Link到前面的target中,并且里面的符号也会被导出,提供给第三方使用
      • PRIVATE:在PRIVATE后面的库仅被Link到前面的target中,并且终结掉,第三方不能感知你调了啥库
      • INTERFACE:在INTERFACE后面引入的库不会被链接到前面的target中,只会导出符号
  • 动态库的链接和静态库是完全不同的
    • 静态库会在生成可执行程序的链接阶段被打包到可执行程序中,所以可执行程序启动,静态库就被加载到内存中了
    • 动态库在生成可执行程序的链接阶段不会被打包到可执行程序中,当可执行程序被启动并且调用了动态库中的函数的时候,动态库才会被加载到内存
    • 因此,在CMake中指定要链接的动态库的时候,应该将命令写到生成了可执行文件之后
  • 链接系统动态库:无需指出库路径
    cmake_minimum_required(VERSION 3.0)
    project(TEST)
    file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
    # 添加并指定最终生成的可执行程序名
    add_executable(app ${SRC_LIST})
    # 指定可执行程序要链接的动态库名字
    target_link_libraries(app pthread)
    
  • 链接第三方动态库:需指出库所在路径
    cmake_minimum_required(VERSION 3.15)
    project(CALC)
    set(CMAKE_CXX_STANDARD 11)
    
    include_directories(${PROJECT_SOURCE_DIR}/include)
    aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
    
    # 指定库搜索路径
    link_directories(${PROJECT_SOURCE_DIR}/lib)
    
    add_executable(app_shared ${SRC})
    
    # 链接动态库
    target_link_libraries(app_shared calc2)