CMake 在Visual Studio下保持目录结构,包括头文件
主要看INCLUDE_DIRECTORIES_EX和my_add_library的使用
cmake_minimum_required(VERSION 2.8)
set(PROJ_NAME your_proj_name)
PROJECT(jni_${PROJ_NAME})
set(PROJECT_MAJOR_VERSION 1)
set(PROJECT_MINOR_VERSION 0)
set(PROJECT_PATCH_VERSION 0)
set(PROJECT_VERSION ${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}.${PROJECT_PATCH_VERSION})
#set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_BUILD_TYPE "Release")
#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG -DNO_LIMIT -###")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG -DNO_LIMIT -isystem -v")
#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG -DNO_LIMIT -fstack-protector -fstack-check -D_GLIBCXX_DEBUG")
#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG -DNO_LIMIT -fstack-protector -fstack-check -fprofile-instr-generate -fcoverage-mapping")
#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG -fstack-protector -fstack-check -fprofile-instr-generate -fcoverage-mapping")
#SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -DNDEBUG")
SET(GCC_CXX_FLAGS, "-static-libgcc -static-libstdc++ -static")
#指定源码路径
AUX_SOURCE_DIRECTORY(. DIR_SRCS )
AUX_SOURCE_DIRECTORY(./src UTIL_SRCS )
SET (headers_all "")
#获取目录下的所有头文件
macro(INCLUDE_DIRECTORIES_EX inc_dir)
INCLUDE_DIRECTORIES(${inc_dir})
FILE(GLOB_RECURSE headers "${inc_dir}/*.hpp" "${inc_dir}/*.h" ) #遍历获取{curdir}中*.hpp和*.h文件列表
LIST(APPEND headers_all ${headers})
endmacro()
INCLUDE_DIRECTORIES(./) #不保持目录结构
INCLUDE_DIRECTORIES_EX(./include) #保持目录结构
#保持源文件/头文件目录结构
function(assign_source_group)
foreach(_source IN ITEMS ${ARGN})
if (IS_ABSOLUTE "${_source}")
file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
else()
set(_source_rel "${_source}")
endif()
get_filename_component(_source_path "${_source_rel}" PATH)
string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
#string(REPLACE "../" "" _source_path_msvc "${_source_path}")
#string(REPLACE "./" "" _source_path_msvc "${_source_path}")
string(REPLACE ".." "" _source_path_msvc "${_source_path}")
string(REPLACE "." "" _source_path_msvc "${_source_path}")
#message(STATUS "source = ${_source}")
if ((${_source} MATCHES ".*.h$") OR (${_source} MATCHES ".*.hpp$"))
source_group("include\\${_source_path_msvc}" FILES "${_source}")
else()
source_group("src\\${_source_path_msvc}" FILES "${_source}")
endif()
endforeach()
endfunction(assign_source_group)
function(my_add_library)
foreach(_source IN ITEMS ${ARGN})
assign_source_group(${_source})
endforeach()
# 此处根据情况修改
ADD_LIBRARY(${ARGV})
# ADD_EXECUTABLE(${ARGV})
endfunction(my_add_library)
my_add_library(${PROJ_NAME} SHARED ${DIR_SRCS} ${headers_all})
ADD_DEFINITIONS( --std=c++11 )
#set (CMAKE_C_FLAGS "-m32")
#ADD_DEFINITIONS( -fno-omit-frame-pointer )
#ADD_DEFINITIONS( -fsanitize=address )
#ADD_DEFINITIONS( -g )
#ADD_DEFINITIONS( -O3 )
#ADD_DEFINITIONS( -fprofile-instr-generate )
#ADD_DEFINITIONS( -fcoverage-mapping )
#follow three line is for gprof profile test
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
#SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
#SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
IF (CMAKE_SYSTEM_NAME MATCHES "Linux")
#INCLUDE_DIRECTORIES(/opt/jdk1.8.0_121/include)
#INCLUDE_DIRECTORIES(/opt/jdk1.8.0_121/include/linux)
TARGET_LINK_LIBRARIES(${PROJ_NAME} libcrypto.a)
TARGET_LINK_LIBRARIES(${PROJ_NAME} libssl.a)
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")
#add_definitions(-DUNICODE -D_UNICODE) # 设置字符集:Unicode
#add_definitions(-DCMAKE_CONFIGURATION_TYPES="Release;Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -DDEBUG -DNO_LIMIT -MTd /ZI /Ob0 /Od /RTC1")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -DNDEBUG -MT")
INCLUDE_DIRECTORIES("C:/Program Files/glog/include") #x64
#INCLUDE_DIRECTORIES("C:/Program Files (x86)/glog/include") #x86
TARGET_LINK_LIBRARIES(${PROJ_NAME} libcrypto.lib")
TARGET_LINK_LIBRARIES(${PROJ_NAME} libssl.lib")
TARGET_LINK_LIBRARIES(${PROJ_NAME} ws2_32.lib)
TARGET_LINK_LIBRARIES(${PROJ_NAME} crypt32.lib)
ENDIF()