编译了hiredis和redis++,使用redis++时报链接错误

766 阅读1分钟

编译出两个开发的库,但是使用时报错"未定义的引用",说明.cpp里编译出的编译单元里符号和库文件符号对不上 老余一顿操作ok,总结如下:

  • 库的c++版本保持和democ++版本保持一致,比如,不要搞成库是用c++11编译,但是democ++17来编译
  • 尽量不要把三方库的命名空间完全释放出来,用sw::redis::Redis redis(URL);来引用
    就本例而言,sw::redisstd命名空间有冲突

  • 贴出CMakeList.txt
    cmake_minimum_required(VERSION 3.10)
    set(CMAKE_CXXFLAGS "${CMAKE_CXX_FLAGS} -o3 --std=c++11  -lstdc++fs")
    
    project(test_redis)
    
    find_package(OpenCV REQUIRED)
    
    # set(HIREDIS_LIBS_PATH /usr/local/lib)  
    include_directories(${OpenCV_INCLUDE_DIRS})  
    
    # 直接包含安装时的头文件,前提是项目小,且库是以默认路径安装的,就推荐如下两种,清爽
    include_directories(/usr/local/include)
    link_directories(/usr/local/lib)
    
    #link_directories(${REDISCPP_LIBS_PATH})  
    add_executable(${PROJECT_NAME} test_redis.cpp)
    target_link_libraries(${PROJECT_NAME} redis++ hiredis ${OpenCV_LIBS} -lstdc++fs) 
    
  • 编译redis++时指定以c++11编译
    cmake -DREDIS_PLUS_PLUS_CXX_STANDARD=11  -DREDIS_PLUS_PLUS_BUILD_TEST=OFF -DREDIS_PLUS_PLUS_BUILD_SHARED=OFF ..
    
  • 小技巧,用ldd来查看需要链接哪些库文件