将库作为Git子模块引入项目后构建系统找不到引用,原因何在?
解决Git子模块引入libfreedom后链接drm符号失败的问题
问题原因
单独编译libfreedom时仅生成动态库,不会触发依赖符号的链接检查;但将其作为子模块引入主项目后,主程序链接该库时需要解析所有未定义符号,此时就会暴露问题:libfreedom的CMake配置仅添加了libdrm的头文件路径,却未明确链接libdrm库,导致drm相关函数符号无法找到。
解决方案
修改libfreedom目录下的CMakeLists.txt,添加链接libdrm库的配置,让libfreedom自身明确依赖libdrm,CMake会自动将该依赖传递给主项目。
修改后的完整CMakeLists.txt:
cmake_minimum_required(VERSION 3.10) project(libfreedom LANGUAGES C) # Specify the C standard set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Add library target add_library(libfreedom SHARED src/libfreedom.c) target_include_directories(libfreedom PRIVATE /usr/include/libdrm) # 新增:链接libdrm库,解决符号未定义问题 target_link_libraries(libfreedom PRIVATE libdrm) # Prevent it from being called liblibfreedom.so set_target_properties(libfreedom PROPERTIES OUTPUT_NAME "freedom" # This will create libfreedom.so ) # Install targets and configuration install(TARGETS libfreedom DESTINATION lib) install(FILES include/libfreedom.h DESTINATION include)
主项目的CMakeLists.txt无需修改,重新执行构建即可解决链接错误。
内容的提问来源于stack exchange,提问作者CocytusDEDI
相关产品推荐
相关产品推荐

