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