cmakeライブラリの解決方法が見つからない

7329 ワード

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 REQUIRD)、find_と書くことはできませんPackage(OPENGL REQUIRD)またはfind_パッケージ形式.
findOpenGLでcmakeファイル内で定義されたヘッダファイルパス名とライブラリファイルパス名はOPENGL_INCLUDE_DIRなのでOpenGL_には書けませんINCLUDE_DIRは、上記の方法により、実際のパス名がOPENGL_であることがわかるINCLUDE_DIR
一般的に言えば、一般ライブラリのは.cmakeファイルにはlibNameのようなものが同時に定義されます.INCLUDE_DIR,LibName_LIBRARY_DIR,libName_DEFINITIONSの3つの変数ですが、この例では.cmakeファイルには後ろの2つのファイルが見つかりません.ライブラリにあります.cmakeファイルの後の2つの変数は必須ではない、例えば、本例では定義されていない.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