cmake找不到库的解决方法

1、cmake在寻找库的时候,若直接提醒寻找库出错,则看看库安装没有,若安装了,看看环境变量,有没有把库所在的目录加进去。

2、若cmake提示找到库了,但是在使用的时候却又找不到库的头文件和库文件,这种情况很有可能是因为具体的指代库目录的变量比如 LibName_INCLUDE_DIR,LibName_LIBRARY_DIRS不对。找具体的目录变量名可以通过寻找对应的.cmake文件,例如今天碰到的,在写OpenGL程序的CMakeLists.txt文件时,

cmake_minimum_required(VERSION 2.6)
project(markerless_ar_demo)
add_compile_options(-std=c++11)

#########################################################
# FIND GLUT
#########################################################
find_package(GLUT REQUIRED)
include_directories(${GLUT_INCLUDE_DIRS})
link_directories(${GLUT_LIBRARY_DIRS})
add_definitions(${GLUT_DEFINITIONS})
if(NOT GLUT_FOUND)
    message(ERROR " GLUT not found!")
endif(NOT GLUT_FOUND)
#########################################################
# FIND OPENGL
#########################################################
find_package(OpenGL REQUIRED)
message(OpenGL_FOUND----:${OpenGL_FOUND})
include_directories(${OpenGL_INCLUDE_DIR})
message(OpenGL_INCLUDE ----- ${OpenGL_INCLUDE_DIR})
message(openGL_LIBRARY ----- ${OpenGL_LIBRARY_DIRS})
link_directories(${OpenGL_LIBRARY_DIRS})
add_definitions(${OpenGL_DEFINITIONS})
if(NOT OpenGL_FOUND)
    message(ERROR " OPENGL not found!")
endif(NOT OpenGL_FOUND)
#########################################################
# FIND GLFW
#########################################################
find_package(glfw3 REQUIRED)
find_package(OpenCV REQUIRED)


include_directories(${OpenCV_INCLUDE_DIR})
include_directories(${OpenGL_INCLUDE_DIR})

link_directories(${OpenCV_LIBRARY_DIR})
link_directories(${OpenGL_LIBRARY_DIR})


add_executable(markerless_ar_demo ARDrawingContext.cpp
    ARDrawingContext.hpp
    CameraCalibration.cpp
    CameraCalibration.hpp
    GeometryTypes.cpp
    GeometryTypes.hpp
    main.cpp
    ARPipeline.hpp
    ARPipeline.cpp
    Pattern.cpp
    Pattern.hpp
    PatternDetector.cpp
    PatternDetector.hpp
    DebugHelpers.hpp
)

target_link_libraries( markerless_ar_demo ${OpenCV_LIBRARIES} )
target_link_libraries( markerless_ar_demo ${OpenGL_LIBRARIES} )
target_link_libraries( markerless_ar_demo glut GLU GL m)

install (TARGETS markerless_ar_demo DESTINATION bin)

OpenGL_FOUND打印出来提示是true,但是在使用时总是找不到头文件,原因在于OpenGL_INCLUDE_DIR这个变量名不对,寻找对应库的路径变量名可以通过在根目录下寻找findOpenGL.cmake文件(find+库名.cmake),因为find_package()寻找的就是该对应库的.cmake文件,而对应库的路径变量就定义在该文件中(有些库会定义在另外一名为“libname-config.cmake”的文件中,如果找不到上面的"findLibName.cmake"可以尝试寻找这个文件,比如google的gflags库,对应的上面的变量就定义在这个文件中)。

这里找到的.cmake文件为findOpenGL.cmake,该文件名字是findOpenGL,故在寻找OpenGL库时必须要写成find_package(OpenGL REQUIRED),而不能写成find_package(OPENGL REQUIRED)或find_package(opengl REQUIRED)形式。

在findOpenGL.cmake文件内定义的头文件路径名和库文件路径名却又是OPENGL_INCLUDE_DIR,所以不能写成OpenGL_INCLUDE_DIR,通过上述方法可知实际的路径名为OPENGL_INCLUDE_DIR

通常了来说,一般库的在.cmake文件中会同时定义类似 libName_INCLUDE_DIR,LibName_LIBRARY_DIR,libName_DEFINITIONS三个变量,但本案例中在.cmake文件中并没有找到后面的的两个文件,在库的.cmake文件中后面两个变量并非必须,比如本例中就没有定义,因为本例中.cmake文件中的OPENGL_LIBRARIES关联的库路径是绝对路径,并不需要LibName_LIBRARY_DIR指定库所在位置。把OPENGL_LIBRARIES打印出来:

message(libaries:${OPENGL_LIBRARIES})

将会得到如下结果:

libaries:/usr/lib/x86_64-linux-gnu/libGLU.so /usr/lib/x86_64-linux-gnu/libGL.so

在上面的例子中只需要把OpenGL_INCLUDE_DIR改成OPENGL_INCLUDE_DIR即可编译成功。虽然OpenGL_LIBRARY_DIR或OPENGL_LIBRARY_DIR这个变量不存在,可以删除掉,即使不删除也不影响编译,不会报错。

最终的CMakeLists.txt如下:

cmake_minimum_required(VERSION 2.6)
project(EXAMPLE_MARKERLESS_AR)
add_compile_options(-std=c++11)

#########################################################
# FIND GLUT
#########################################################
find_package(GLUT REQUIRED)
include_directories(${GLUT_INCLUDE_DIRS})
link_directories(${GLUT_LIBRARY_DIRS})
add_definitions(${GLUT_DEFINITIONS})
if(NOT GLUT_FOUND)
    message(ERROR " GLUT not found!")
endif(NOT GLUT_FOUND)
#########################################################
# FIND OPENGL
#########################################################
find_package(OpenGL REQUIRED)
include_directories(${OPENGL_INCLUDE_DIR})
message(opengl_INCLUDE ----- ${OPENGL_INCLUDE_DIR})
message(opengl_LIBRARY ----- ${OPENGL_LIBRARY_DIR})
message(libaries--${OPENGL_LIBRARIES})
#link_directories(${OpenGL_LIBRARY_DIRS})
add_definitions(${OpenGL_DEFINITIONS})
if(NOT OPENGL_FOUND)
    message(ERROR " OPENGL not found!")
endif(NOT OPENGL_FOUND)
#########################################################
# FIND GLFW
#########################################################
find_package(glfw3 REQUIRED)
find_package(OpenCV REQUIRED )


include_directories(${OpenCV_INCLUDE_DIR})
include_directories(${OPENGL_INCLUDE_DIR})

link_directories(${OpenCV_LIBRARY_DIR})
#link_directories(${OpenGL_LIBRARY_DIR})


add_executable(markerless_ar_demo ARDrawingContext.cpp
    ARDrawingContext.hpp
    CameraCalibration.cpp
    CameraCalibration.hpp
    GeometryTypes.cpp
    GeometryTypes.hpp
    main.cpp
    ARPipeline.hpp
    ARPipeline.cpp
    Pattern.cpp
    Pattern.hpp
    PatternDetector.cpp
    PatternDetector.hpp
    DebugHelpers.hpp
)

target_link_libraries( markerless_ar_demo ${OpenCV_LIBRARIES} )
target_link_libraries( markerless_ar_demo ${OPENGL_LIBRARIES} )

target_link_libraries(markerless_ar_demo glut GLU GL m)

install (TARGETS markerless_ar_demo DESTINATION bin)

运行cmake 命令后

-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found GLUT: /usr/lib/x86_64-linux-gnu/libglut.so  
-- Found OpenGL: /usr/lib/x86_64-linux-gnu/libGL.so  
opengl_INCLUDE-----/usr/include
opengl_LIBRARY-----
libaries--/usr/lib/x86_64-linux-gnu/libGLU.so/usr/lib/x86_64-linux-gnu/libGL.so
-- Found OpenCV: /opt/ros/kinetic (found version "3.3.1") 
-- Configuring done
-- Generating done

make编译

➜  build make   
Scanning dependencies of target markerless_ar_demo
[ 12%] Building CXX object CMakeFiles/markerless_ar_demo.dir/ARDrawingContext.cpp.o
[ 25%] Building CXX object CMakeFiles/markerless_ar_demo.dir/CameraCalibration.cpp.o
[ 37%] Building CXX object CMakeFiles/markerless_ar_demo.dir/GeometryTypes.cpp.o
[ 50%] Building CXX object CMakeFiles/markerless_ar_demo.dir/main.cpp.o
[ 62%] Building CXX object CMakeFiles/markerless_ar_demo.dir/ARPipeline.cpp.o
[ 75%] Building CXX object CMakeFiles/markerless_ar_demo.dir/Pattern.cpp.o
[ 87%] Building CXX object CMakeFiles/markerless_ar_demo.dir/PatternDetector.cpp.o
[100%] Linking CXX executable markerless_ar_demo
[100%] Built target markerless_ar_demo

 

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值