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_executable
或 add_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})
在这个示例中:
-
find_library(YOUR_LIBRARY NAMES your_library PATHS /path/to/your/libs)
:find_library
命令用于在指定的路径中查找库文件。YOUR_LIBRARY
是一个变量名,用于存储找到的库文件的路径。NAMES your_library
指定要查找的库的名称(不需要文件扩展名)。PATHS /path/to/your/libs
指定搜索库文件的路径。
-
add_executable(MyExecutable main.cpp)
:add_executable
命令用于生成可执行文件。MyExecutable
是生成的可执行文件的名称。main.cpp
是项目的源文件。
-
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})
运行步骤
- 创建构建目录:在项目根目录下创建一个
build
目录,用于存放构建过程中生成的文件。
mkdir build
cd build
- 运行 CMake 生成构建文件:
cmake ..
在这个过程中,CMake 会根据 CMakeLists.txt
的配置查找 pthread
库,并输出相应的信息。如果找到库,会显示库的路径;如果没找到,会输出错误信息并终止构建过程。
3. 编译项目:
cmake --build .
这一步会使用生成的构建文件来编译项目,最终生成可执行文件。
4. 运行可执行文件:
./FindPthreadExample
如果一切正常,你将看到线程输出的信息以及主线程的结束信息。
注意事项
- 在不同的操作系统和系统配置下,
pthread
库的路径可能会有所不同。上述示例中列出的/usr/lib
和/usr/local/lib
是常见的搜索路径,但你可能需要根据实际情况调整。 - 在一些系统中,
pthread
库可能已经在默认搜索路径中,因此不需要显式指定PATHS
参数。
通过这种方式,你可以使用 find_library
来查找和链接 pthread
库。