使用CMake构建程序时链接器无法找到mearlymath库求助
解决CMake链接静态库时找不到-lmearlymath的问题
错误原因分析
出现ld: library not found for -lmearlymath错误,核心是CMake在链接阶段无法定位到/usr/local/lib下的libmearlymath.a静态库,涉及两个关键问题:
- 库的CMakeLists.txt中,
install指令仅配置了动态库(LIBRARY目标)的安装,缺失静态库对应的ARCHIVE目标; - 测试项目的CMakeLists.txt未明确告知CMake库的搜索路径,导致链接器无法找到库文件。
解决方案步骤
步骤1:修正库的CMakeLists.txt,完善静态库安装配置
打开SomeLibDemo/AddLibDemo/CMakeLists.txt,修改install指令,同时支持静态库和动态库的安装:
cmake_minimum_required(VERSION 3.27.2) project(mearlymath) add_library(${PROJECT_NAME} adder.cpp) set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER adder.h) # 同时配置静态库(ARCHIVE)和动态库(LIBRARY)的安装路径 install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib PUBLIC_HEADER DESTINATION include)
回到库的build目录,重新编译并安装:
cmake .. make make install
步骤2:修改测试项目的CMakeLists.txt,让CMake找到库
以下两种方法任选其一:
方法一:直接指定路径(快速测试用)
修改TestSome/CMakeLists.txt,明确添加头文件和库的搜索路径:
cmake_minimum_required(VERSION 3.27.2) project(testsome) add_executable(testsome main.cpp) # 指定头文件目录 target_include_directories(testsome PRIVATE /usr/local/include) # 指定库文件搜索目录 link_directories(/usr/local/lib) # 链接静态库 target_link_libraries(testsome PRIVATE mearlymath)
方法二:使用find_package(规范的CMake方式,推荐)
这种方式适合长期维护的库,需要先给库添加导出配置:
- 在库的目录
SomeLibDemo/AddLibDemo下创建Config.cmake.in文件,内容如下:
@PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/mearlymathTargets.cmake") check_required_components(mearlymath)
- 修改库的CMakeLists.txt,添加配置导出代码(放在
install指令之后):
export(PACKAGE ${PROJECT_NAME}) include(CMakePackageConfigHelpers) # 生成版本配置文件 write_basic_package_version_file( "${PROJECT_NAME}ConfigVersion.cmake" VERSION 1.0.0 COMPATIBILITY AnyNewerVersion ) # 生成配置文件 configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" INSTALL_DESTINATION lib/cmake/${PROJECT_NAME} ) # 安装配置文件 install( FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" DESTINATION lib/cmake/${PROJECT_NAME} )
- 重新编译安装库:
cd SomeLibDemo/AddLibDemo/build make clean cmake .. make make install
- 修改测试项目的CMakeLists.txt,使用
find_package加载库:
cmake_minimum_required(VERSION 3.27.2) project(testsome) add_executable(testsome main.cpp) # 查找并加载mearlymath库 find_package(mearlymath REQUIRED) # 链接库 target_link_libraries(testsome PRIVATE mearlymath)
验证解决效果
回到测试项目的build目录,重新执行:
cmake .. make
此时应该能成功编译链接,生成testsome可执行文件。
内容的提问来源于stack exchange,提问作者anton
相关产品推荐
相关产品推荐

