Cmake系列:如何使用CMake编译自己项目

来源:互联网 发布:淘宝订单清洗过期 编辑:程序博客网 时间:2024/06/17 08:43

original url:

http://blog.csdn.net/xizero00/article/details/50975156


举个例子来说,假如想编译自己写的基于OpenCV的程序那么
如果你是使用的是ubuntu的话,就很方便。

如果你使用gflags和glog的话那么执行安装:
[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. sudo apt-get install libgoogle-glog-dev libflags-dev  

如果你还使用protobuf那么执行安装
[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. sudo apt-get install protobuf-compiler libprotobuf-dev  

如果你使用boost
[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. sudo apt-get install libboost-all-dev  

如果你使用opencv
[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. sudo apt-get install libopencv-dev  

接下来安装正角:
[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. sudo apt-get install cmake cmake-qt-gui  

然后自己写自己的CMakeLists.txt,内容如下:
[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. cmake_minimum_required(VERSION 2.8)  
  2. project(Disp)  
  3.   
  4. set(LINKER_LIBS "")  
  5.   
  6. # opencv  
  7. find_package(OpenCV REQUIRED)  
  8. include_directories(${OpenCV_INCLUDE_DIRS})  
  9. list(APPEND LINKER_LIBS ${OpenCV_LIBS})  
  10.   
  11. # glog  
  12. # 这是从caffe中获取的  
  13. include("cmake/FindGlog.cmake")  
  14. #find_package(lib_glog REQUIRED)  
  15. include_directories(SYSTEM ${GLOG_INCLUDE_DIRS})  
  16. list(APPEND LINKER_LIBS ${GLOG_LIBRARIES})  
  17.   
  18. # gflags  
  19. # 这是从caffe中获取的  
  20. include("cmake/FindGFlags.cmake")  
  21. #find_package(GFlags REQUIRED)  
  22. include_directories(SYSTEM ${GFLAGS_INCLUDE_DIRS})  
  23. list(APPEND LINKER_LIBS ${GFLAGS_LIBRARIES})  
  24.   
  25. # 加入你自己编译成可执行文件的名称以及对应的代码  
  26. add_executable(1 1.cpp)  
  27. # 链接时候的库文件  
  28. target_link_libraries(1 ${LINKER_LIBS})  



此时呢,你需要将caffe目录下的cmake/Modules/中的
FindGlog.cmake和FindGFlags.cmake都复制到自己的项目中的cmake文件夹下
这样cmake就能自动找到glog以及gflags的头文件以及库文件了。
这里假设自己的代码文件就一个文件:1.cpp

然后执行cmke-gui
选择你自己的项目的目录configure一下。
勾选cmake界面的Grouped和Advanced
然后找到CMAKE下面的CMAKE_BUILD_TYPE,填入Debug即可设置项目为Debug模式,这样在你导入到eclipse的时候可以进行调试
如果不设置成Debug还可以设置为Release等模式。
当然如果你不喜欢图形界面也可以用cmake -DCMAKE_BUILD_TYPE=Debug /your/project/path 来生成makefile文件。

最后放出
FindGFlags.cmake和FindGlog.cmake的代码,这样你就不需要下载这两个文件了,其实caffe里面给出很多可用的cmake文件。


[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # - Try to find GFLAGS  
  2. #  
  3. # The following variables are optionally searched for defaults  
  4. #  GFLAGS_ROOT_DIR:            Base directory where all GFLAGS components are found  
  5. #  
  6. # The following are set after configuration is done:  
  7. #  GFLAGS_FOUND  
  8. #  GFLAGS_INCLUDE_DIRS  
  9. #  GFLAGS_LIBRARIES  
  10. #  GFLAGS_LIBRARYRARY_DIRS  
  11.   
  12. include(FindPackageHandleStandardArgs)  
  13.   
  14. set(GFLAGS_ROOT_DIR "" CACHE PATH "Folder contains Gflags")  
  15.   
  16. # We are testing only a couple of files in the include directories  
  17. if(WIN32)  
  18.     find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h  
  19.         PATHS ${GFLAGS_ROOT_DIR}/src/windows)  
  20. else()  
  21.     find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h  
  22.         PATHS ${GFLAGS_ROOT_DIR})  
  23. endif()  
  24.   
  25. if(MSVC)  
  26.     find_library(GFLAGS_LIBRARY_RELEASE  
  27.         NAMES libgflags  
  28.         PATHS ${GFLAGS_ROOT_DIR}  
  29.         PATH_SUFFIXES Release)  
  30.   
  31.     find_library(GFLAGS_LIBRARY_DEBUG  
  32.         NAMES libgflags-debug  
  33.         PATHS ${GFLAGS_ROOT_DIR}  
  34.         PATH_SUFFIXES Debug)  
  35.   
  36.     set(GFLAGS_LIBRARY optimized ${GFLAGS_LIBRARY_RELEASE} debug ${GFLAGS_LIBRARY_DEBUG})  
  37. else()  
  38.     find_library(GFLAGS_LIBRARY gflags)  
  39. endif()  
  40.   
  41. find_package_handle_standard_args(GFlags DEFAULT_MSG GFLAGS_INCLUDE_DIR GFLAGS_LIBRARY)  
  42.   
  43.   
  44. if(GFLAGS_FOUND)  
  45.     set(GFLAGS_INCLUDE_DIRS ${GFLAGS_INCLUDE_DIR})  
  46.     set(GFLAGS_LIBRARIES ${GFLAGS_LIBRARY})  
  47.     message(STATUS "Found gflags  (include: ${GFLAGS_INCLUDE_DIR}, library: ${GFLAGS_LIBRARY})")  
  48.     mark_as_advanced(GFLAGS_LIBRARY_DEBUG GFLAGS_LIBRARY_RELEASE  
  49.                      GFLAGS_LIBRARY GFLAGS_INCLUDE_DIR GFLAGS_ROOT_DIR)  
  50. endif()  
  
将以上代码保存为FindGFlags.cmake

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # - Try to find Glog  
  2. #  
  3. # The following variables are optionally searched for defaults  
  4. #  GLOG_ROOT_DIR:            Base directory where all GLOG components are found  
  5. #  
  6. # The following are set after configuration is done:  
  7. #  GLOG_FOUND  
  8. #  GLOG_INCLUDE_DIRS  
  9. #  GLOG_LIBRARIES  
  10. #  GLOG_LIBRARYRARY_DIRS  
  11.   
  12. include(FindPackageHandleStandardArgs)  
  13.   
  14. set(GLOG_ROOT_DIR "" CACHE PATH "Folder contains Google glog")  
  15.   
  16. if(WIN32)  
  17.     find_path(GLOG_INCLUDE_DIR glog/logging.h  
  18.         PATHS ${GLOG_ROOT_DIR}/src/windows)  
  19. else()  
  20.     find_path(GLOG_INCLUDE_DIR glog/logging.h  
  21.         PATHS ${GLOG_ROOT_DIR})  
  22. endif()  
  23.   
  24. if(MSVC)  
  25.     find_library(GLOG_LIBRARY_RELEASE libglog_static  
  26.         PATHS ${GLOG_ROOT_DIR}  
  27.         PATH_SUFFIXES Release)  
  28.   
  29.     find_library(GLOG_LIBRARY_DEBUG libglog_static  
  30.         PATHS ${GLOG_ROOT_DIR}  
  31.         PATH_SUFFIXES Debug)  
  32.   
  33.     set(GLOG_LIBRARY optimized ${GLOG_LIBRARY_RELEASE} debug ${GLOG_LIBRARY_DEBUG})  
  34. else()  
  35.     find_library(GLOG_LIBRARY glog  
  36.         PATHS ${GLOG_ROOT_DIR}  
  37.         PATH_SUFFIXES lib lib64)  
  38. endif()  
  39.   
  40. find_package_handle_standard_args(Glog DEFAULT_MSG GLOG_INCLUDE_DIR GLOG_LIBRARY)  
  41.   
  42. if(GLOG_FOUND)  
  43.   set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR})  
  44.   set(GLOG_LIBRARIES ${GLOG_LIBRARY})  
  45.   message(STATUS "Found glog    (include: ${GLOG_INCLUDE_DIR}, library: ${GLOG_LIBRARY})")  
  46.   mark_as_advanced(GLOG_ROOT_DIR GLOG_LIBRARY_RELEASE GLOG_LIBRARY_DEBUG  
  47.                                  GLOG_LIBRARY GLOG_INCLUDE_DIR)  
  48. endif()  
  49.     


将以上代码保存为FindGlog.cmake


通过CMake管理自己的项目的编译是不是觉得很方便呢,自动生成makefile文件,而且还能够处理头文件以及库文件的问题,感觉世界清爽多了,可以安静地写自己的程序了。

0 0
原创粉丝点击