背景:
多个项目在一个解决方案,但每个项目的源文件路径不在一起。会导致一个项目引用另一个项目的时候需要1、添加附加库目录这里相对和绝对路径其实没什么区别了,因为team里的其他人这些项目可能和我的路径不相同就算添加相对路径也不能兼容;2、将源文件拷贝到当前引用项目目录下,但是这样有时候修改文件是会导致多个项目的文件不一致,维护起来会有问题多个项目引用一个文件时候就需要同时维护多个相同文件,如项目A、B、C、D需要E项目下的e.h文件,则需要拷贝4份到ABCD四个项目下,当e.h在任何一个项目中被修改时则需要把修改的文件与其他几个项目做同步。这样维护起来就很费劲。3、之前开发因为项目文件和源代码是在一起的,所以git上传代码时候会多出很多文件,以及一些运行着的文件导致上传不上去,其实Github上的大部分代码都是没有上传项目文件的,也就是他们的源代码是和项目分离的,Visual studio 的项目目录里最典型的一个隐藏文件夹".vs",这个也总导致文件被占用push fail。
解决工具CMAKE,目的将所有项目源文件放到一个统一的目录下,通过CMAKE工具来自动生成解决方案以及项目和项目配置等。这样每个人只需要在电脑上使用CMAKE来生成自己的项目文件就可以了。
先上 CMakelists.txt:
# CMake file for XXXXtmgr
# DATE:2019-08-29
# CMAKE verison
cmake_minimum_required(VERSION 3.2)
# Project name
project(XXXXtmgr)
set(srcDir "modules")
set(libraay_dir "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty")
# Log project
FILE(GLOB COMMON_HEAD_RIGEL_EDITOR ${srcDir}/common/*.h )
FILE(GLOB COMMON_SRCS_RIGEL_EDITOR ${srcDir}/common/*.cpp)
FILE(GLOB LOG_HEAD_RIGEL_EDITOR ${srcDir}/log/*.h)
FILE(GLOB LOG_SRCS_RIGEL_EDITOR ${srcDir}/log/*.cpp)
list(REMOVE_ITEM LOG_HEAD_RIGEL_EDITOR ${CMAKE_CURRENT_SOURCE_DIR}/${srcDir}/log/logserver.h)
list(REMOVE_ITEM LOG_SRCS_RIGEL_EDITOR ${CMAKE_CURRENT_SOURCE_DIR}/${srcDir}/log/logserver.cpp)
message("log-header dir:${LOG_HEAD_RIGEL_EDITOR}")
message("cmke current dir:${CMAKE_CURRENT_SOURCE_DIR}")
message("cmke current dir:${CMAKE_CURRENT_BINARY_DIR}")
# XXXXtmgr project
FILE(GLOB XXXXtmgr_HEAD_RIGEL_EDITOR ${srcDir}/XXXXtmgr/*.h ${srcDir}/log/logserver.h)
FILE(GLOB XXXXtmgr_SRCS_RIGEL_EDITOR ${srcDir}/XXXXtmgr/*.cpp ${srcDir}/log/logserver.cpp)
# XXXl-sdl project
FILE(GLOB XXXl_SDL_HEAD_RIGEL_EDITOR ${srcDir}/XXXl-sdl/*.h)
FILE(GLOB XXXl_SDL_SRCS_RIGEL_EDITOR ${srcDir}/XXXl-sdl/*.cpp)
# create project
add_executable(XXXXtmgr ${XXXXtmgr_HEAD_RIGEL_EDITOR} ${XXXXtmgr_SRCS_RIGEL_EDITOR})
add_library(log SHARED ${LOG_HEAD_RIGEL_EDITOR} ${LOG_SRCS_RIGEL_EDITOR} ${COMMON_HEAD_RIGEL_EDITOR})
add_library(XXXl-sdl SHARED ${XXXl_SDL_HEAD_RIGEL_EDITOR} ${XXXl_SDL_SRCS_RIGEL_EDITOR})
target_include_directories(log PRIVATE 3rdparty)
target_include_directories(XXXl-sdl PRIVATE 3rdparty)
target_include_directories(XXXXtmgr PRIVATE 3rdparty)
target_link_directories(XXXl-sdl PRIVATE 3rdparty/libs)
target_link_directories(XXXXtmgr PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/Debug)
target_link_libraries(XXXl-sdl ${CMAKE_CURRENT_BINARY_DIR}/Debug/log.lib SDL2.lib Ws2_32.lib)
target_link_libraries(XXXXtmgr ${CMAKE_CURRENT_BINARY_DIR}/Debug/log.lib XXXl-sdl.lib)
set_target_properties(log PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_BINARY_DIR}/Debug
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_BINARY_DIR}/Release
)
set_target_properties(XXXl-sdl PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_BINARY_DIR}/Debug
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_BINARY_DIR}/Release
)
set_target_properties(XXXXtmgr PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_BINARY_DIR}/Debug
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_BINARY_DIR}/Release
)
add_definitions(-DUNICODE -D_UNICODE)
message("duild dir:${BUILD_DIR_RIGELEDITOR_DEBUG}")
source_group("source\\core\\log" FILES ${LOG_SRCS_RIGEL_EDITOR})
source_group("source\\core\\common" FILES ${COMMON_SRCS_RIGEL_EDITOR})
source_group("header\\core\\log" FILES ${LOG_HEAD_RIGEL_EDITOR})
source_group("header\\core\\common" FILES ${COMMON_HEAD_RIGEL_EDITOR})
上面就是我前段时间弄得一个CMakelist文件,效果已经解决了背景描述的问题。今天我把其中一个删掉了,就剩两个项目了。用Cmake生成出来就是下图这样。
1、ALL_BUILD的用途是如果你编译这个项目就等于编译所有项目,如果全部编译就会先编译ZERO_CHECK然后编译自己的项目。
2、编译ZERO_CHECK就是将项目通过CMakelist文件进行重新生成,如果CMakelist文件没有变化项目也就不会有变化。
正文
第一次先写一个简单的样例来测试一下:
1、创建cmake-sample文件夹,在该文件夹中创建一个存放源代码的目录,一个名为CMakelist.txt的文件。
2、在Source-code文件夹内创建一个名为main.cpp文件。
文件 CMakelist.txt :
# CMake file for cmake-sample
# DATE: 2019-09-10
# Author: tayu
set(author tayu)
set(cname cmake-sample)
set(cmake-mini-version 3.2)
message("CMake file for ${cname}")
message("author: ${author}")
message("cmake minimum version : ${cmake-mini-version}")
project(cname)
set(dir Source-code)
File(GLOB SOURCES_FILE ${dir}/*.cpp ${dir}/*.h)
message(${SOURCES_FILE})
add_executable(sample ${SOURCES_FILE})
文件 main.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "hello cmake!" << endl;
return 0;
}
使用CMake GUI 工具:
黄色路径则是CMakelists.txt路径,而绿色的则是自定义的输出项目文件的路径,依次点击按钮1看到Configuring done,点击Generating done,最后打开项目(ps:按钮3是快捷键)去绿色目录下就会有项目文件可以打开了。
这个sample生成的项目样子:
默认启动项是ALL_BUILD这个项目,应该在蓝色项目上右键设置为启动项这样第一个sample就完成了。
Cmake语法
首先注意一个事情就是CMake的参数是已空格分隔,不需要分号(;)结尾。
Set(name Value) :设置一个变量 变量名为第一个参数,第二个为变量的值。
Message(multiple parameters):输出语句,多个参数。引号中的变量应该用${}这样包括。
Project(name):解决方案(solution)的名称。
File():文件列表,GLOB则是遍历当前路径下所有文件,不包括子文件夹。
add_executable(name source):这个则是生成exe项目,第一个为项目名称,第二个为项目资源,多个资源空格相隔。add_library则是生成动态库项目。