目前cmake是一个比较流行的编译工具, 当工程放在多级文件夹中时,如何使用cmake让其成为一个完成的功能,下面是我自己在项目中的一个小工程使用cmake进行编译创建功能:
首先我的源码是code文件夹,code文件包含两个文件夹一个是image文件夹另一个是.cpp和.h文件,最终使用cmake构建后再code同级文件夹生成output文件夹用来进行最终的exe输出的,这其中包含Release和Debug,bulid文件夹是在使用cmake时手动创建,用来存放vs启动工程
code中的内容如下:
其中CMakeList.txt内容:
cmake_minimum_required(VERSION 3.6 FATAL_ERROR)
project(CheckOutTool VERSION 1.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
cmake_policy(SET CMP0079 NEW)
project(CheckOutTool)
include (FindOpenMP)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
if (OPENMP_FOUND)
message("build with openmp")
set (HAVE_OPENMP TRUE)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
endif()
include("${PROJECT_SOURCE_DIR}/macro.cmake")
add_definitions(-D_BIND_TO_CURRENT_VCLIBS_VERSION=1)
add_definitions(-D_UNICODE -DUNICODE)
add_definitions(-DPROTOBUF_USE_DLLS)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
string(REGEX REPLACE "/code" "" PROJECT_OUTPUT_DIR ${PROJECT_SOURCE_DIR})
set(PROJECT_OUTPUT_DIR "${PROJECT_OUTPUT_DIR}/output")
set(EXECUTABLE_OUTPUT_PATH "${PROJECT_OUTPUT_DIR}")
set(LIBRARY_OUTPUT_PATH "${PROJECT_OUTPUT_DIR}")
option (GENERATE_DEBUG_INFO "always generate debug info" OFF)
SET(CMAKE_DEBUG_POSTFIX d)
subdirs(Source)
macro.cmake中的内容为:
**# Copy files from source directory to destination directory, substituting any
# variables. Create destination directory if it does not exist.**
macro(configure_files srcDir destDir)
# message(STATUS "Configuring directory ${destDir}")
make_directory(${destDir})
file(GLOB templateFiles RELATIVE ${srcDir} ${srcDir}
其中CMamkeLists.txt中的内容主要是该工程的一些依赖项和将动态库拷贝到exe同目录,内容为:
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/Source/workFile/)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
#set(src main.cpp CheckOutWin.cpp CheckOutWin.h ReadFile.cpp ReadFile.h SerialPortMonitoring.cpp SerialPortMonitoring.h ToolDataModel.cpp ToolDataModel.h UDPNet.cpp UDPNet.h)
include("${PROJECT_SOURCE_DIR}/Source/workFile/src.cmake")
add_executable(CheckOutTool WIN32 ${src} ${PROJECT_SOURCE_DIR}/Source/image/Resource.qrc)
find_package(Qt5 COMPONENTS Core Gui Widgets NetWork SerialPort )
target_link_libraries(CheckOutTool
Qt5::Core
Qt5::Gui
Qt5::Widgets
Qt5::SerialPort
Qt5::Network)
set_target_properties(CheckOutTool PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/../output/$(Configuration)")
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT CheckOutTool)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Cored.dll DESTINATION ${PROJECT_OUTPUT_DIR}/debug/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Widgetsd.dll DESTINATION ${PROJECT_OUTPUT_DIR}/debug/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Guid.dll DESTINATION ${PROJECT_OUTPUT_DIR}/debug/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Core.dll DESTINATION ${PROJECT_OUTPUT_DIR}/release/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Widgets.dll DESTINATION ${PROJECT_OUTPUT_DIR}/release/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Gui.dll DESTINATION ${PROJECT_OUTPUT_DIR}/release/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Networkd.dll DESTINATION ${PROJECT_OUTPUT_DIR}/debug/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Network.dll DESTINATION ${PROJECT_OUTPUT_DIR}/release/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5SerialPortd.dll DESTINATION ${PROJECT_OUTPUT_DIR}/debug/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5SerialPort.dll DESTINATION ${PROJECT_OUTPUT_DIR}/release/)
configure_files("${_qt5Widgets_install_prefix}/plugins/platforms" "${PROJECT_OUTPUT_DIR}/debug/platforms")
configure_files("${_qt5Widgets_install_prefix}/plugins/platforms" "${PROJECT_OUTPUT_DIR}/release/platforms")
在workFile文件夹中是.cpp和.h文件,但是其中有一个src.cmake文件,是将.cpp和.h文件放入到一边src变量中在Source文件夹中的CMakeLists.text中使用
set(dir "${PROJECT_SOURCE_DIR}/Source/workFile")
set(work_source
${dir}/main.cpp
${dir}/CheckOutWin.cpp
${dir}/ReadFile.cpp
${dir}/SerialPortMonitoring.cpp
${dir}/ToolDataModel.cpp
${dir}/UDPNet.cpp
)
set(work_header
${dir}/ReadFile.h
${dir}/CheckOutWin.h
${dir}/SerialPortMonitoring.h
${dir}/ToolDataModel.h
${dir}/UDPNet.h
)
source_group(workFile FILES ${work_source} ${work_header})
set(src ${src} ${work_source} ${work_header})