CMake使用小结
指定本地库的位置
set(Qt5_DIR "path")
list(APPEND CMAKE_PREFIX_PATH ${Qt5_DIR})
设置编译输出的路径
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin)
file(GLOB headers *.h *.hpp)
file(GLOB srcs *.cpp)
add_executable(${app_name} ${headers} ${srcs} )
target_link_libraries(${app_name} ...)
file使用
file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])
file(RENAME <oldname> <newname>)
file({REMOVE | REMOVE_RECURSE } [<files>...])
file(MAKE_DIRECTORY [<dir>...])
file({COPY | INSTALL} <file>... DESTINATION <dir> [...])
file(COPY E:\\VSProject\\Surface\\build\\bin\\Debug\\Surface.exe DESTINATION C:\\Surface)
execute_process使用
execute_process(COMMAND windeployqt.exe E:\\VSProject\\Surface\\build\\bin\\Debug\\Surface.exe --dir E:\\VSProject\\Surface\\build\\bin\\Debug RESULT_VARIABLE ret)
添加一些基本的库
Boost
find_package(Boost COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
target_link_libraries(${app_name} ${Boost_LIBRARIES})
Qt
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
file(GLOB ui_files *.ui)
file(GLOB resource_files *.qrc)
//在配置lib或exe时需要将resource 文件和 ui 文件添加进去
//add_executable(${app_name} ${headers} ${ui_files} ${resource_files})
find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED)
target_link_libraries(${app_name} Qt5::Core Qt5::Gui Qt5::Widgets)
VTK
find_package(VTK REQUIRED)
include_directories(${VTK_INCLUDE_DIRS})
//${VTK_LIBRARIES}
PCL
find_package(PCL 1.8 REQUIRED COMPONENTS common features filters kdtree ml octree registration io segmentation visualization)
include_directories(${PCL_INCLUDE_DIRS})
add_definitions(${PCL_DEFINITIONS})
//${PCL_LIBRARIES}
CMAKE_PREFIX_PATH是以分号分隔的列表,供find_package(), find_program(), find_library(), find_file()和find_path()使用,初始为空。
CMAKE_MODULE_PATH是以分号分隔的列表,供include()或 find_package()使用。初始为空。
两者的选择,优先使用CMAKE_PREFIX_PATH
CMAKE_BINARY_DIR 编译路径
CMAKE_CURRENT_BINARY_DIR 编译路径
CMAKE_SOURCE_DIR源文件的根路径
CMAKE_CURRENT_SOURCE_DIR 当前源文件路径
CMAKE_SHARED_LIBRARY_SUFFIX共享库的后缀
CMAKE_SHARED_LIBRARY_PREFIX共享库的前缀
CMAKE_EXECUTABLE_SUFFIX 可执行程序后缀
CMAKE_INCLUDE_PATH 头文件包含目录
CMAKE_LIBRARY_PATH 库文件包含目录
if (MSVC)
set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
)
foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
endforeach()
endif(MSVC)
范例
cmake_minimum_required(VERSION 3.7)
set(ProName "Surface")
project(${ProName})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/bin/RelWithDebInfo)
set(HEADERS)
set(SRCS)
set(LIBS)
set(ASSIMP_DIR "./thirdPath/Assimp")
set(STB_DIR "./thirdPath/stb")
link_directories(${ASSIMP_DIR}/lib/)
include_directories(${ASSIMP_DIR}/include)
include_directories(${STB_DIR})
add_library(STB_IMAGE "${STB_DIR}/deprecated/stb_image.c")
list(APPEND LIBS STB_IMAGE)
list(APPEND LIBS assimp)
find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
#INCLUDE(${QT_USE_FILE})
#INCLUDE_DIRECTORIES(
# C:/pro/OpenCV/build/include
# C:/pro/OpenCV/src/modules/highgui/include
#)
#include_directories(C:/pro/OpenCV/build/lib/$(ConfigurationName))
#TARGET_LINK_LIBRARIES(${ProName}
# debug OpenCV_core249d.lib
# debug OpenCV_imgproc249d.lib
# debug OpenCV_highgui249d.lib
# debug OpenCV_video249d.lib
# optimized OpenCV_core249.lib
# optimized OpenCV_imgproc249.lib
# optimized OpenCV_highgui249.lib
# optimized OpenCV_video249.lib
#)
include_directories(${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS})
message(STATUS ${Qt5Core_INCLUDE_DIRS}\n ${Qt5Gui_INCLUDE_DIRS}\n ${Qt5Widgets_INCLUDE_DIRS}\n)
add_definitions(${Qt5Core_DEFINITIONS} ${Qt5Gui_DEFINITIONS} ${Qt5Widgets_DEFINITIONS})
message(STATUS ${Qt5Core_DEFINITIONS}\n ${Qt5Gui_DEFINITIONS}\n ${Qt5Widgets_DEFINITIONS}\n)
list(APPEND LIBS ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Widgets_LIBRARIES})
message(STATUS ${Qt5Core_LIBRARIES}\n ${Qt5Gui_LIBRARIES}\n ${Qt5Widgets_LIBRARIES}\n)
file(GLOB HEADERS ./*.h ./*.hpp)
file(GLOB SRCS ./*.cxx ./*.cpp)
add_executable(${ProName} ${HEADERS} ${SRCS})
target_link_libraries(${ProName} ${LIBS})
execute_process(COMMAND windeployqt.exe ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO}/${ProName}.exe --dir ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO})
get_filename_component(value "protos/helloworld.proto" PATH)
DIRECTORY = 没有文件名的目录
NAME = 没有目录的文件名
EXT = 文件名最长扩展名 (.b.c from d/a.b.c)
NAME_WE = 既没有目录也没有最长扩展名的文件名
LAST_EXT = 文件最后一个扩展名 (.c from d/a.b.c)
NAME_WLE = 既没有目录也没有最后一个扩展名的文件名
PATH = 同DIRECTORY,没有文件名的目录 (use for CMake <= 2.8.11)
ABSOLUTE = 文件的完整路径
REALPATH = 已解析符号链接的现有文件的完整路径