如何正确使用CMake的find_library?自建动态库链接失败求助
解决CMake找不到共享库的问题
问题核心分析
你当前的问题主要是两个:一是find_library的路径设置错误,二是缺少头文件路径配置;另外如果先编译app再编译库,也会导致找不到库。下面给出两种可行的解决方法:
方法一:修正路径配置(适合分开编译库和app)
1. 先编译生成libsort.so
进入lib目录,创建build子目录并执行编译:
cd lib mkdir build && cd build cmake .. && make
执行完成后,libsort.so会生成在lib/build/deploy目录下。
2. 修改app目录下的CMakeLists.txt
修正库的查找路径,同时添加头文件目录(否则编译main.cpp会找不到sort.h):
cmake_minimum_required(VERSION 3.22) project(my_app) # 从app目录向上回到主目录,定位到lib的deploy目录 find_library(LIB_FILE sort HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../lib/build/deploy REQUIRED) add_executable(my_app main.cpp) # 链接目标库 target_link_libraries(${PROJECT_NAME} ${LIB_FILE}) # 添加头文件搜索路径 target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/include)
3. 编译app
进入app目录,创建build子目录执行编译:
cd app mkdir build && cd build cmake .. && make
方法二:用CMake子项目统一编译(更推荐,无路径烦恼)
这种方式让CMake自动管理依赖关系,无需手动处理路径问题。
1. 在主目录创建根CMakeLists.txt
cmake_minimum_required(VERSION 3.22) project(my_project) # 添加lib子项目,自动编译生成sort库 add_subdirectory(lib) # 添加app子项目 add_subdirectory(app)
2. 修改app目录下的CMakeLists.txt
直接链接已导入的sort库,无需find_library:
cmake_minimum_required(VERSION 3.22) project(my_app) add_executable(my_app main.cpp) # 直接链接sort库(lib子项目已将其导入CMake环境) target_link_libraries(${PROJECT_NAME} PRIVATE sort)
注:由于
lib的CMakeLists中用PUBLIC设置了头文件目录,链接时会自动传递给app,无需额外配置头文件路径。
3. 统一编译
在主目录创建build子目录执行编译:
mkdir build && cd build cmake .. && make
CMake会自动先编译libsort.so,再编译my_app可执行文件。
内容的提问来源于stack exchange,提问作者I_am_shitty_programer
相关产品推荐
相关产品推荐

