您的位置:首页 > 其它

CMakeLists.txt 文件&范例

2018-03-19 23:28 411 查看
[align=center]CMakeLists.txt 文件[/align] 前的项目代码在src 目录。 src 下有子目录:server, utility, lib, bin, build

      server-----  存放项目的主功能类文件      utility  -----  存放项目要用到相关库文件,便已成为库文件存放到子目录lib 中      lib      -----  存放utility 生成的库      bin     -----  存放association 生成的二进制文件      build  -----  编译目录,存放编译生成的中间文件

 cmake 要求工程主目录和所有存放源代码子目录下都要编写CMakeLists.txt 文件,注意大小写(cm 大写,list中l 大写且落下s).

 src/CMakeLists.txt 文件如下:      -------------------------------------------------------------------------------------------------------------      #author:      #created:
       CMAKE_MINIMUM_REQUIRED(VERSION 2.8)               #cmake 最低版本要求,低于2.6 构建过程会被终止。       PROJECT(server_project)                                             #定义工程名称
       MESSAGE(STATUS "Project: SERVER")                       #打印相关消息消息       MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")
       SET(CMAKE_BUILE_TYPE DEBUG)                             #指定编译类型      SET(CMAKE_C_FLAGS_DEBUG "-g -Wall")                #指定编译器       ADD_SUBDIRECTORY(utility)                                      #添加子目录       ADD_SUBDIRECTORY(server)    -------------------------------------------------------------------------------------------------------------

 相关解释:      1. CMakeLists.txt 文件中不区分大小写      2. PROJECT(project_name)    定义工程名称          语法:project(projectname [cxx] [c] [java])          可以指定工程采用的语言,选项分别表示:C++, C, java, 如不指定默认支持所有语言      3. MESSAGE(STATUS, "Content")  打印相关消息          输出消息,供调试CMakeLists.txt 文件使用。      4. SET(CMAKE_BUILE_TYPE DEBUG)  设置编译类型debug 或者release。 debug 版会生成相关调试信息,可以使用GDB 进行           调试;release不会生成调试信息。当无法进行调试时查看此处是否设置为debug.      5. SET(CMAKE_C_FLAGS_DEBUG "-g -Wall") 设置编译器的类型          CMAKE_C_FLAGS_DEBUG            ----  C 编译器          CMAKE_CXX_FLAGS_DEBUG        ----  C++ 编译器       6. ADD_SUBDIRECTORY(utility) 添加要编译的子目录           为工程主目录下的存放源代码的子目录使用该命令,各子目录出现的顺序随意。       如上便是工程server_project 主目录src 下的CMakeLists.txt 文件,下一篇我们解释子目录utiltiy中的CMakeLists.txt 文件。

 子目录utility 下的CMakeLists.txt 文件如下:--------------------------------------------------------------------------------------------------------------------     #Cmake file for library utility.a     #Author:       #Created: 
     SET(SOURCE_FILES                                  #设置变量,表示所有的源文件             ConfigParser.cpp             StrUtility.cpp             )
     INCLUDE_DIRECTORIES(                          #相关头文件的目录              /usr/local/include              ${PROJET_SOURCE_DIR}/utility     )
    LINK_DIRECTORIES(                                  #相关库文件的目录             /usr/local/lib    )
    ADD_LIBRARY(association ${SOURCE_FILES})           #生成静态链接库libassociation.a    TARGET_LINK_LIBRARY(association core)                #依赖的库文件        SET_TARGET_PROPERTIES(utility  PROPERTIES      #表示生成的执行文件所在路径    RUNTIME_OUTPUT_DIRECTORY> "${PROJECT_SOURCE_DIR}/lib")
--------------------------------------------------------------------------------------------------------------------    相关解释:    1. SET(SOURCE_FILES .....)      表示要编译的源文件,所有的源文件都要罗列到此处。set 设置变量,变量名SOURCE_FILES自定义。    2. INCLUDE_DIRECTORY(...)      include头文件时搜索的所有目录    变量PROJECT_SOURCE_DIR 表示工程所在的路径,系统默认的变量    3. LINK_DIRECTORIES(...)     库文件存放的目录,在程序连接库文件的时候要再这些目录下寻找对应的库文件    4.
4000
ADD_LIBRARY(...)      表示生成静态链接库libassociaiton.a,由${PROJECT_SOURCE_DIR}代表的文件生成。     语法:ADD_LIBRARY(libname [SHARED|STATIC]     SHARED 表示生成动态库, STATIC表示生成静态库。    5. TARGET_LINK_LIBRARY(association core)      表示库association 依赖core库文件     6. SET_TARGET_PROPERTIES     设置编译的库文件存放的目录,还可用于其他属性的设置。如不指定,     生成的执行文件在当前编译目录下的各子目录下的build目录下,好拗口!简单一点:     如指定在: ./src/lib 下     不指定在: ./src/build/utility/build 目录下     生成的中间文件在./src/build/utilty/build 目录下,不受该命令额影响

     子目录server 下的CMakeLists.txt 文件:    --------------------------------------------------------------------------------------------     SET(SOURCE_FILES             Gassociation.cpp             ConfigurationHandler.cpp     )
     INCLUDE_DIRECTORIES(               /usr/local/include              ${PROJECT_SOURCE_DIR}/utility              ${PROJECT_SOURCE_DIR}/association     )
     LINK_LIBRARIES(                 /usr/local/lib                 ${PROJECT_SOURCE_DIR}/lib     )
     ADD_EXECUTABLE(server  ${SOURCE_FILES})
     TARGET_LINK_LIBRARIES(server                                                 utility     )     SET_TARGET_PROPERTIES(server  PROPERTIES    #表示生成的执行文件所在路径     RUNTIME_OUTPUT_DIRECTORY  "${PROJECT_SOURCE_DIR}/bin")     -------------------------------------------------------------------------------------------------------     相关解释:     1. ADD_EXECUTABLE()     #指定要生成的执行文件的名称server        其他用法同utilty/CMakeLists.txt     2. SET_TARGET_PROPERTIES      设置生成的执行文件存放的路径,      注意:      执行文件server 依赖的子目录utility 子目录生成的静态库libutility.a,在指定的时候要写成:      TARGET_LINK_LIBRARIES(server   utility)      而不能写成:      TARGET_LINK_LIBRARIES(server   libutility.a)      否则编译总会提示找不到libutility库文件。      但使用第三方的库却要指定成具体的库名,如:libACE-6.0.0.so      这一点很诡异,暂时还没找到原因。
      完成对应的CMakeLists.txt 文件编写后,便可以进行编译了。      编译:            进入 ./src/build            执行cmake ..            make

[align=center]Cmakelist范例[/align] SET(PROJECT_NAME Sophus)
 
PROJECT(${
PROJECT_NAME
})
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
 
SET (CMAKE_VERBOSE_MAKEFILE ON)
 
#Release by default
#Turn on Debug with "-DCMAKE_BUILD_TYPE=Debug"
IF( NOT CMAKE_BUILD_TYPE )
   
SET( CMAKE_BUILD_TYPE Release )
ENDIF()
 
IF (CMAKE_COMPILER_IS_GNUCXX )
   
SET(CMAKE_CXX_FLAGS_DEBUG 
"-O0 -g"
)
   
SET(CMAKE_CXX_FLAGS_RELEASE
"
194a2
-O3 -DNDEBUG "
)
 
  
ADD_DEFINITIONS("-Wall -Werror -Wno-unused-variable
                   
-Wno-unused-but-set-variable -Wno-unknown-pragmas ")
ENDIF()
 
################################################################################
#Add local path for finding packages, set the local version first
set( CMAKE_MODULE_PATH "${
CMAKE_SOURCE_DIR
}/cmake_modules" )
list( APPEND CMAKE_MODULE_PATH "${
CMAKE_ROOT
}/Modules" )
 
################################################################################
#Create variables used for exporting in SophusConfig.cmake
set( Sophus_LIBRARIES
""
)
set( Sophus_INCLUDE_DIR ${
PROJECT_SOURCE_DIR
} )
 
################################################################################
 
include(FindEigen3.cmake)
#find_package( Eigen3 REQUIRED )
INCLUDE_DIRECTORIES( ${
EIGEN3_INCLUDE_DIR
} )
SET( Sophus_INCLUDE_DIR ${
Sophus_INCLUDE_DIR
} ${
EIGEN3_INCLUDE_DIR
} )
 
SET (SOURCE_DIR
"sophus"
)
 
SET (TEMPLATES tests
               
so2
               
se2
               
so3
               
se3
               
rxso3
               
sim3
)
 
SET (SOURCES ${
SOURCE_DIR
}/sophus.hpp)
 
FOREACH(templ ${
TEMPLATES
})
  
LIST(APPEND SOURCES ${
SOURCE_DIR
}/${
templ
}.hpp)
ENDFOREACH(templ)
  
INCLUDE_DIRECTORIES(${
INCLUDE_DIRS
})
 
#Added ${
SOURCES
} to executables so they show up in QtCreator (and possibly
#other IDEs).
#ADD_EXECUTABLE(test_so2 sophus/test_so2.cpp ${
SOURCES
})
#ADD_EXECUTABLE(test_se2 sophus/test_se2.cpp ${
SOURCES
})
#ADD_EXECUTABLE(test_so3 sophus/test_so3.cpp ${
SOURCES
})
#ADD_EXECUTABLE(test_se3 sophus/test_se3.cpp ${
SOURCES
})
#ADD_EXECUTABLE(test_rxso3 sophus/test_rxso3.cpp ${
SOURCES
})
#ADD_EXECUTABLE(test_sim3 sophus/test_sim3.cpp ${
SOURCES
})
#ENABLE_TESTING()
#
#ADD_TEST(test_so2 test_so2)
#ADD_TEST(test_se2 test_se2)
#ADD_TEST(test_so3 test_so3)
#ADD_TEST(test_se3 test_se3)
#ADD_TEST(test_rxso3 test_rxso3)
#ADD_TEST(test_sim3 test_sim3)
 
################################################################################
#Create the SophusConfig.cmake file for other cmake projects.
CONFIGURE_FILE( ${
CMAKE_CURRENT_SOURCE_DIR
}/SophusConfig.cmake.in
    
${
CMAKE_CURRENT_BINARY_DIR
}/SophusConfig.cmake @ONLY IMMEDIATE )
export( PACKAGE Sophus )
 
INSTALL(DIRECTORY sophus DESTINATION ${
CMAKE_INSTALL_PREFIX
}/include
        
FILES_MATCHING PATTERN
"*.hpp"
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: