当前位置: 首页 > article >正文

CMake library path

CMake 添加库文件时默认搜索路径

当使用 CMake 的 find_library 或在链接目标时指定库名,CMake 会在一系列默认路径中搜索库文件。这些默认路径通常依赖于操作系统,以下是一些常见操作系统的默认搜索路径:

Linux
  • /lib
  • /usr/lib
  • /usr/local/lib
macOS
  • /usr/lib
  • /usr/local/lib
Windows
  • 系统目录(如 C:\Windows\System32
  • PATH 环境变量中指定的目录

如何添加库文件的路径

在 CMake 中,有几种方法可以添加自定义的库文件搜索路径,下面分别介绍:

1. 使用 link_directories 命令

link_directories 命令用于指定链接器搜索库文件的目录。

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 添加自定义库文件搜索路径
link_directories(/path/to/your/library)

# 添加可执行文件
add_executable(MyExecutable main.cpp)

# 链接库文件
target_link_libraries(MyExecutable your_library_name)

注意link_directories 命令应该在 add_executableadd_library 之前使用,并且该命令不推荐在现代 CMake 中使用,因为它可能会导致一些难以调试的问题。

2. 使用 find_library 命令

find_library 命令可以在指定的路径中搜索库文件,并将找到的库文件的完整路径存储在一个变量中。

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 搜索库文件
find_library(MY_LIBRARY your_library_name
             PATHS /path/to/your/library
             NO_DEFAULT_PATH)

if(MY_LIBRARY)
    message(STATUS "Found library: ${MY_LIBRARY}")
else()
    message(FATAL_ERROR "Library not found")
endif()

# 添加可执行文件
add_executable(MyExecutable main.cpp)

# 链接库文件
target_link_libraries(MyExecutable ${MY_LIBRARY})
  • PATHS:指定要搜索的路径。
  • NO_DEFAULT_PATH:表示只在指定的路径中搜索,不搜索默认路径。
3. 使用 CMAKE_PREFIX_PATH 变量

CMAKE_PREFIX_PATH 是一个全局变量,CMake 会在这些路径下搜索库文件和头文件。

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 设置 CMAKE_PREFIX_PATH
set(CMAKE_PREFIX_PATH "/path/to/your/library" ${CMAKE_PREFIX_PATH})

# 搜索库文件
find_library(MY_LIBRARY your_library_name)

if(MY_LIBRARY)
    message(STATUS "Found library: ${MY_LIBRARY}")
else()
    message(FATAL_ERROR "Library not found")
endif()

# 添加可执行文件
add_executable(MyExecutable main.cpp)

# 链接库文件
target_link_libraries(MyExecutable ${MY_LIBRARY})

在运行 CMake 时,也可以通过 -DCMAKE_PREFIX_PATH 参数来设置该变量:

cmake -DCMAKE_PREFIX_PATH="/path/to/your/library" ..

以上三种方法都可以用来添加库文件的搜索路径,你可以根据具体情况选择合适的方法。


示例二:使用 find_library

cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 查找库文件路径
find_library(YOUR_LIBRARY NAMES your_library PATHS /path/to/your/libs)

# 添加库
add_executable(MyExecutable main.cpp)
target_link_libraries(MyExecutable ${YOUR_LIBRARY})

在这个示例中:

  1. find_library(YOUR_LIBRARY NAMES your_library PATHS /path/to/your/libs):

    • find_library 命令用于在指定的路径中查找库文件。
    • YOUR_LIBRARY 是一个变量名,用于存储找到的库文件的路径。
    • NAMES your_library 指定要查找的库的名称(不需要文件扩展名)。
    • PATHS /path/to/your/libs 指定搜索库文件的路径。
  2. add_executable(MyExecutable main.cpp):

    • add_executable 命令用于生成可执行文件。
    • MyExecutable 是生成的可执行文件的名称。
    • main.cpp 是项目的源文件。
  3. target_link_libraries(MyExecutable ${YOUR_LIBRARY}):

    • target_link_libraries 命令用于将库文件链接到目标可执行文件。
    • MyExecutable 是目标可执行文件的名称。
    • ${YOUR_LIBRARY} 是之前通过 find_library 查找到的库文件路径。

这样一来,CMake 会在你指定的路径中查找库文件,并将其链接到生成的可执行文件中。这种方法更灵活,因为你可以将库文件的位置传递给 CMake,而不需要手动指定路径。


下面是一个使用 find_library 来查找 pthread 库的 CMake 示例,同时会给出对应的 main.cpp 文件示例以及整个项目的运行步骤。

项目结构

project/
├── CMakeLists.txt
└── main.cpp

main.cpp 文件

这个文件是一个简单的 C++ 程序,用于创建一个线程,以此来测试 pthread 库是否能正常链接和使用。

#include <iostream>
#include <pthread.h>

// 线程函数
void* threadFunction(void* arg) {
    std::cout << "Hello from the thread!" << std::endl;
    return nullptr;
}

int main() {
    pthread_t thread;
    // 创建线程
    int result = pthread_create(&thread, nullptr, threadFunction, nullptr);
    if (result != 0) {
        std::cerr << "Failed to create thread" << std::endl;
        return 1;
    }
    // 等待线程结束
    pthread_join(thread, nullptr);
    std::cout << "Thread has finished" << std::endl;
    return 0;
}

CMakeLists.txt 文件

# 设置 CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(FindPthreadExample)

# 查找 pthread 库
find_library(PTHREAD_LIBRARY
    NAMES pthread # 库的名称
    PATHS /usr/lib /usr/local/lib # 搜索路径,这里列出的是常见的路径
    DOC "Path to the pthread library" # 关于该库的描述信息
)

# 检查是否找到 pthread 库
if(PTHREAD_LIBRARY)
    message(STATUS "Found pthread library: ${PTHREAD_LIBRARY}")
else()
    message(FATAL_ERROR "pthread library not found")
endif()

# 添加可执行文件
add_executable(FindPthreadExample main.cpp)

# 链接 pthread 库到可执行文件
target_link_libraries(FindPthreadExample PRIVATE ${PTHREAD_LIBRARY})

运行步骤

  1. 创建构建目录:在项目根目录下创建一个 build 目录,用于存放构建过程中生成的文件。
mkdir build
cd build
  1. 运行 CMake 生成构建文件
cmake ..

在这个过程中,CMake 会根据 CMakeLists.txt 的配置查找 pthread 库,并输出相应的信息。如果找到库,会显示库的路径;如果没找到,会输出错误信息并终止构建过程。
3. 编译项目

cmake --build .

这一步会使用生成的构建文件来编译项目,最终生成可执行文件。
4. 运行可执行文件

./FindPthreadExample

如果一切正常,你将看到线程输出的信息以及主线程的结束信息。

注意事项

  • 在不同的操作系统和系统配置下,pthread 库的路径可能会有所不同。上述示例中列出的 /usr/lib/usr/local/lib 是常见的搜索路径,但你可能需要根据实际情况调整。
  • 在一些系统中,pthread 库可能已经在默认搜索路径中,因此不需要显式指定 PATHS 参数。

通过这种方式,你可以使用 find_library 来查找和链接 pthread 库。


http://www.kler.cn/a/518620.html

相关文章:

  • python:taichi 模拟一维波场
  • JS面相对象小案例:自定义安全数组
  • 网易Android开发面试题200道及参考答案 (下)
  • 攻防世界bad_python
  • MongoDB 备份与恢复综述
  • 【数据分享】1929-2024年全球站点的逐月平均能见度(Shp\Excel\免费获取)
  • 利用Kubespray安装生产环境的k8s集群-排错篇
  • uniapp封装websocket
  • tcp/ip协议通俗理解,tcpip协议通俗理解
  • 统计文本文件中单词频率的 Swift 与 Bash 实现详解
  • SpringBoot统一数据返回格式 统一异常处理
  • 填坑 hydra 暴力破解
  • 【开源免费】基于Vue和SpringBoot的常规应急物资管理系统(附论文)
  • pytest自动化测试 - 构造“预置条件”的几种方式
  • RAG如何让生成AI更智能?最新方法与优劣深度解析
  • 【linux】linux c判断IP地址类型及是否合法
  • Spring MVC中HandlerInterceptor的作用及应用场景
  • CVE-2025-0411 7-zip 漏洞复现
  • 防抖与节流:优化高频事件的两种利器
  • 「pandas」python pandas 初步、数据结构Series、DataFrame、MultiIndex
  • 【最小堆】【动态规划】力扣264. 丑数 II
  • 【Elasticsearch】eland是啥?
  • F#语言的图形用户界面
  • MarsCode青训营打卡Day11(2025年1月24日)|稀土掘金-373.字母出现次数的统计
  • 【OpenGL】OpenGL游戏案例(一)
  • Leetcode-两数之和