这是项目的整个目录结构
#此种方式配置犹如Vs中的配置一样
# CMakeLists file
cmake_minimum_required(VERSION 2.6)
project (server)
#编译选项
SET(CMAKE_CXX_FLAGS_DEBUG "-g -ggdb -Wall -Wno-unknown-pragmas")
SET(CMAKE_CXX_FLAGS "-std=c++0x -Wno-deprecated")
SET(CMAKE_CXX_FLAGS_RELEASE "-g -O2")
SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--hash-style=sysv")
#指定头文件
#其中PROJECT_SOURCE_DIR是此CMakeList所在的目录
include_directories ("${PROJECT_SOURCE_DIR}/lib/linux/include" "${PROJECT_SOURCE_DIR}/lib/linux/include/mysql" "${PROJECT_SOURCE_DIR}/lib/boost_1_53_0" "${PROJECT_SOURCE_DIR}/event" )
#指定链接库(libXXXX.so动态库, libXXXX.a静态库)的目录
link_directories ("${PROJECT_SOURCE_DIR}/lib/linux/lib")
#添加子目录(其中子目录中含有项目文件.cpp)
add_subdirectory (common)
add_subdirectory (event)
add_subdirectory (logic)
add_subdirectory (net)
add_subdirectory (worldd)
add_subdirectory (gamed)
add_subdirectory (pvpwar/battled)
add_subdirectory (pvpwar/matchd)
#最终要生成的可执行文件 和main函数所在的文件
add_executable (gamed gamed/Daemon.cpp)
add_executable (worldd worldd/worldd.cpp)
add_executable (battled pvpwar/battled/battle.cpp)
add_executable (matchd pvpwar/matchd/match.cpp)
#指定生成的可执行程序需要的库如gamed 依赖于gamed game logic event common net protobuf log4cxx config++ tokyotyrant mysqlclient
target_link_libraries (gamed game logic event common net protobuf log4cxx config++ tokyotyrant mysqlclient)
target_link_libraries (worldd world logic event common net protobuf log4cxx config++ tokyotyrant)
target_link_libraries (battled battle logic event common net protobuf log4cxx config++ )
target_link_libraries (matchd match logic event common net protobuf log4cxx config++ tokyotyrant mysqlclient)
#这是自动写子目录CMakeList的脚本,文件名为叫autoCeateSubCmakeList.sh(对应项目目录图片中的./buildcmake.sh)
#build net
cd net
rm -f CMakeLists.txt
echo "# CMakeLists file">>CMakeLists.txt
echo "add_library(net NetCache.cpp NetHandler.cpp ProtocolHandler.cpp )">>CMakeLists.txt
cd ..
#build common
cd common
rm -f CMakeLists.txt
echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(common ">>CMakeLists.txt
ls xml/*.cpp>>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo ") ">>CMakeLists.txt
cd ..
#build event
cd event
rm -f CMakeLists.txt
echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(event ">>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo ") ">>CMakeLists.txt
cd ..
#build gamed
cd gamed
rm -f CMakeLists.txt
echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(game ">>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
ls event/*.cpp>>CMakeLists.txt
echo ") ">>CMakeLists.txt
cd ..
#build logic
cd logic
rm -f CMakeLists.txt
echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(logic ">>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo ") ">>CMakeLists.txt
cd ..
#build worldd
cd worldd
rm -f CMakeLists.txt
echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(world ">>CMakeLists.txt
ls event/*.cpp>>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo ") ">>CMakeLists.txt
cd ..
#build battle
cd pvpwar/battled
rm -f CMakeLists.txt
echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(battle ">>CMakeLists.txt
ls event/*.cpp>>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo ") ">>CMakeLists.txt
cd ../..
#build match
cd pvpwar/matchd
rm -f CMakeLists.txt
echo "# CMakeLists file" >>CMakeLists.txt
echo "">>CMakeLists.txt
echo "add_library(match ">>CMakeLists.txt
ls event/*.cpp>>CMakeLists.txt
ls *.cpp>>CMakeLists.txt
echo ") ">>CMakeLists.txt
cd ../..
此时在主CmakeList.txt文件下,
先执行./autoCeateSubCmakeList.sh,目的是生成子文件夹下CMakeLists.txt
然后执行cmake . 目的是让主CMakeList根据配置还有根据子文件夹下的CMakeList.txt生成makefile
然后就可以执行make的指令进行编译了
#以后代码有更新直接调用此脚本即可自动编译,如果以后有新增加的文件夹,那么需要重新在上面的脚本和主CMakeList中按照格式新增新的文件夹
#!/bin/bash
set -x
svn up
./buildcmake.sh
make -j 8