linux网络编程之广播详细代码及文档说明 -,cmake代码实践1之Linux网络编程

本文仅是以最基本的cmake为例,先认识一下

下面以工程中实际开发代码为例做讲解,这里一共有3个要配置的步骤:

第1个是系统(linux)环境配置.有些环境参数要配置,比如路径

第2个是工程的顶层cmake

第3个是工程下的子cmake*N个

第4个是cmake的一些基本命令,供参考

---------------------------第1个是系统(linux)环境配置.有些环境参数要配置,比如路径---------------------------

1.源代码

配置步骤 配置说明 备注

(1)

配置路径 第1步:在默认路径(或/home/用户名),找到.bashrc(可用ls -a查看隐藏文件)

第2步:在.bashrc文件最后一行添加如下代码

export TOP_ROOT=/home/andy/servers

export ACE_LIB=$TOP_ROOT/depends/ACE_wrappers/lib

export CPPCONN_LIB=$TOP_ROOT/depends/mysqlcppconn/lib

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TOP_ROOT:$CPPCONN_LIB

拷贝到别的电脑上时,需要改2处cmake下的用户名即可

login文档下

entry文档下

(2)

日志路径 在servers/login/bin目录下新建log文件夹(写的日志会自动保存在这个目录下,名为log.out),必须要建.否则日志不会打印在屏幕上,但是运行还是在运行

(3)

IP地址 在\login\bin目录下,新建一个**任意名.ini(此处为db.ini),增加内容:改成自己的虚拟机IP

[user]

host      = 192.168.1.248

port      = 26000

(4)

配置文件

svc.conf 在\login\bin目录下,新建svc.conf

日志动态库

dynamic Logger Service_Object * ACE:_make_ACE_Logging_Strategy() "-m 1024 -N 10 -s ./log/log.out -f STDERR|OSTREAM"

login登录服动态库

dynamic Login_Server Service_Object * gamelogic:_make_Login_Server()

2.讲解

名称

功能简介

功能详细介绍(大部分是摘抄收集而来)

备注

1

关于.bashrc

Linux下系统环境默认配置的文件,在这里添加程序默认的设置.这里主要是配置的环境变量

/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.

并从/etc/profile.d目录的配置文件中搜集shell的设置.

/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.

~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该

文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.

~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该

该文件被读取.

~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.

另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.

~/.bash_profile 是交互式、login 方式进入 bash 运行的

~/.bashrc 是交互式 non-login 方式进入 bash 运行的

通常二者设置大致相同,所以通常前者会调用后者。

2

关于export

设置或显示环境变量。

语 法:export [-fnp][变量名称]=[变量设置值]

补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该此登录操作。

-f 代表[变量名称]中为函数名称。

-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。

-p 列出所有的shell赋予程序的环境变量。

讲解:

(1)普通定义

export TOP_ROOT=/home/andy/servers

排除export之后,之后的定义与widnows类似,只不过windows是用界面替代了这个=号而已

(2)怎样使用定义的环境变量

用$TOP_ROOT,与windows类似

例如export ACE_LIB=$TOP_ROOT/depends/ACE_wrappers/lib

(3)新增定义

类似于windows的系统环境变量中path路径中;都是在此基础上新增

注:windows新增用分号;

Linux新增用冒号:

例如

export PATH=$PATH:$HOME/bin

备注:$HOME/bin 为新增加的。

3

log.out

是ACE日志策略中,默认输出的日志文件

ACE_Service_Config 。它是整个服务配置器框架的应用开发接口 。

该文件含有所有服务对象的配置信息。其缺省的名字是 svc.conf 。 当你的应用对 ACE_Service_Config 发出 open() 调用时,服务配置器框架会读取并处理你写在此文件中的所有配置信息,随后相应地配置应用。

,详见此文档的补充说明

---------------------------第2个是工程的顶层cmake---------------------------

1.源代码

PROJECT(game)

IF(WIN32)

MESSAGE(FATAL_ERROR "unsupport window platform")

ELSE(WIN32)

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

ENDIF(WIN32)

SET(TOP_ROOT /home/wesom/servers)

SET(BOOST_ROOT ${TOP_ROOT}/depends/boost_1_46_0)

SET(CPPCONN_ROOT ${TOP_ROOT}/depends/mysqlcppconn)

SET(ACE_ROOT ${TOP_ROOT}/depends/ACE_wrappers)

ADD_SUBDIRECTORY(logic)

ADD_SUBDIRECTORY(entry)

2.讲解

名称 功能简介 功能详细介绍(大部分是摘抄收集而来) 备注

1 PROJECT(game) 指定生成的工程名为game project(HelloCmake),project也是CMake的命令,里面的参数HelloCMake是你要生成的工程的名字,换句话说就是生成的***.sln或者***.dsw等工程项目文件的名字。 一般用不上,同VS下一样,工程名而已.用以区分项目中不同的工程

2 IF(WIN32)

MESSAGE(FATAL_ERROR "unsupport window platform")

ELSE(WIN32)

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

ENDIF(WIN32) 如果在windows下运行,提示不支持windows平台,并且立即终止所有 cmake 过程.

如果不在windows下运行,则cmake版本号最低是2.6

ENDIF(WIN32)与IF(WIN32)配套使用的

(1)IF-ELSE-ENDIF说明

一个小例子,用来判断平台差异:IF(WIN32)     MESSAGE(STATUS “This is windows.”)     #作一些 Windows 相关的操作ELSE(WIN32)     MESSAGE(STATUS “This is not windows”)     #作一些非 Windows 相关的操作ENDIF(WIN32)上述代码用来控制在不同的平台进行不同的控制,但是,阅读起来却并不是那么舒服,ELSE(WIN32)之类的语句很容易引起歧义。这就用到了我们在“常用变量”一节提到的 CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 开关。可以 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)这时候就可以写成:IF(WIN32)ELSE()ENDIF()如果配合 ELSEIF 使用,可能的写法是这样:IF(WIN32)#do something related to WIN32ELSEIF(UNIX)#do something related to UNIXELSEIF(APPLE)#do something related to APPLEENDIF(WIN32)

注:IF必须要与ENDIF配对使用

MESSAGE(FATAL_ERROR "unsupport window platform")说明

MESSAGE 指令的语法是:MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)这个指令用于向终端输出用户定义的信息,包含了三种类型:SEND_ERROR,产生错误,生成过程被跳过。SATUS,输出前缀为—的信息。FATAL_ERROR,立即终止所有 cmake 过程.

(3)CMAKE_MINIMUM_REQUIRED(VERSION 2.6)说明

五,系统信息1,CMAKE_MAJOR_VERSION,CMAKE 主版本号,比如 2.4.6 中的 22,CMAKE_MINOR_VERSION,CMAKE 次版本号,比如 2.4.6 中的 43,CMAKE_PATCH_VERSION,CMAKE 补丁等级,比如 2.4.6 中的 64,CMAKE_SYSTEM,系统名称,比如 Linux-2.6.225,CMAKE_SYSTEM_NAME,不包含版本的系统名,比如 Linux6,CMAKE_SYSTEM_VERSION,系统版本,比如 2.6.227,CMAKE_SYSTEM_PROCESSOR,处理器名称,比如 i686.8,UNIX,在所有的类 UNIX 平台为 TRUE,包括 OS X 和 cygwin9,WIN32,在所有的 win32 平台为 TRUE,包括 cygwin

-----------

cmake_minimum_required(VERSION 2.6)这是对CMake版本的要求,基本上每个CMakeLists.txt文件里都会有这句代码,cmake_minimum_required是 cmake里的命令,可大写小写。VERSION这个关键字必须是大写,而且不能省略;2.6就是CMake的版本号,现在的版本是2.8.3。

3 SET(TOP_ROOT /home/andy/servers)

SET(BOOST_ROOT ${TOP_ROOT}/depends/boost_1_46_0)

SET(CPPCONN_ROOT ${TOP_ROOT}/depends/mysqlcppconn)

SET(ACE_ROOT ${TOP_ROOT}/depends/ACE_wrappers) 包含这些库下的头文件

(与VC类似,比如新建command目录时,要在设置选项中包含此目录一样),

SET命令有好几种,

此处的SET是设置环境变量的意思 SET 指令的语法是:SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

现阶段,你只需要了解 SET 指令可以用来显式的定义变量即可。比如我们用到的是 SET(SRC_LIST       main.c),如果有多个源文件,也可以定义成:SET(SRC_LIST main.c t1.c t2.c)。

特殊的环境变量 CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH务必注意,这两个是环境变量而不是 cmake 变量。使用方法是要在 bash 中用 export 或者在 csh 中使用 set 命令设置或者CMAKE_INCLUDE_PATH=/home/include cmake ..等方式。这两个变量主要是用来解决以前 autotools 工程中--extra-include-dir 等参数的支持的。也就是,如果头文件没有存放在常规路径(/usr/include, /usr/local/include 等),则可以通过这些变量就行弥补。

例如用SET变量(export之前有介绍)

SET(LIBRARY_OUTPUT_PATH )来指定一个新的位置。

4 ADD_SUBDIRECTORY(logic)

ADD_SUBDIRECTORY(entry) 包含子目录

这里有2个子目录(entry与logic) 工程名Login目录下一共有2个放代码的目录(其它没关系的文件不需要包含,例如docs之类)

entry放的是main入口函数

logic放的是处理程序的函数

---------------------------第3个是工程下的子cmake*N个---------------------------

子cmake1:

1.源代码

INCLUDE_DIRECTORIES( ${ACE_ROOT}/include )

LINK_DIRECTORIES( ${ACE_ROOT}/lib )

#set output path

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

MESSAGE(STATUS "program output path = ${EXECUTABLE_OUTPUT_PATH}")

ADD_EXECUTABLE(gameserver main.cpp)

TARGET_LINK_LIBRARIES(gameserver ACE)

2.讲解

名称 功能简介 功能详细介绍(大部分是摘抄收集而来) 备注

1 INCLUDE_DIRECTORIES( ${ACE_ROOT}/include )

和windows下包含ACE头文件功能类似

例如#include "ace/Service_Config.h" include_directories:指定头文件的搜索路径

Linux写法是${ACE_ROOT}/include

Windows写法是$(ACE_ROOT)\lib,系统中path写法是%ACE_ROOT%\lib

此处了解2者区别即可

2 LINK_DIRECTORIES( ${ACE_ROOT}/lib ) 和windows下包含ACE库文件功能类似

例如"ACEd.lib"与"ACE.lib"这些库 link_directories:动态链接库或静态链接库的搜索路径

3 #set output path #代表注释

和C++中//功能类似

4 SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) 设置可执行文件的存放路径,此处是放在bin目录下(它会生成一个gameserver的可执行文件) EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径

使用 SET(EXECUTABLE_OUTPUT_PATH )并不会对这个变量造成影响,并不会对这个变量造成影响,它仅仅修改了最终目标文件存放的路径。

PROJECT_SOURCE_DIR:工程顶层目录(login目录下)

5 MESSAGE(STATUS "program output path = ${EXECUTABLE_OUTPUT_PATH}") 命令 MESSAGE 会将参数的内容输出到终端 详细介绍上面有介绍

此处是STATUS,所以仅是输出信息而已,没有要求退出

6 ADD_EXECUTABLE(gameserver main.cpp) 指定main.cpp源文件(入口函数),编译成可执行程序gameserver

即,这个可以改可执行程序的名字 add_executable:编译可执行程序,指定编译

第1种:指定源文件

例如add_executable (helloDemo demo.cxx demo_b.cxx)  #将cxx编译成可执行文件helloDemo

第2种:指定源目录

例如ADD_EXECUTABLE(main ${DIR_SRCS})

使用命令 ADD_EXECUTABLE 指示变量 DIR_SRCS 中的源文件需要编译 成一个名称为 main 的可执行文件。

TARGET_LINK_LIBRARIES(gameserver ACE) 这里还不能正式生成可执行文件的DEMO,需要可执行文件(gameserver)+库(ACE)配合才可以,这个ACE是ACE库中的动态库,原型是libACE.so,

写法有3种:

第1种:libACE.so

第2种:ACE.so

第3种:ACE target_link_libraries:添加链接库

>> target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo

TARGET_LINK_LIBRARIES的全部语法是:

TARGET_LINK_LIBRARIES(target library1 library2...)这个指令可以用来为target添加需要链接的共享库,本例中是一个可执行文件,但是同样可以用于为自己编写的共享库添加共享库链接。为了解决我们前面遇到的HelloFunc未定义错误,我们需要作的是向src/CMakeLists.txt中添加如下指令:TARGET_LINK_LIBRARIES(main hello)也可以写成TARGET_LINK_LIBRARIES(main libhello.so)这里的hello指的是我们上一节构建的共享库libhello.

那如何链接到静态库呢?方法很简单:将TARGET_LINK_LIBRRARIES指令修改为:TARGET_LINK_LIBRARIES(main libhello.a)重新构建

子cmake2:

1.源代码

#set command includes

SET(COMMAND_INCLUDES ${TOP_ROOT}/command)

MESSAGE(STATUS "command include dir = ${COMMAND_INCLUDES}")

#set cppconn includes

SET(CPPCONN_INCLUDES ${CPPCONN_ROOT}/include)

MESSAGE(STATUS "mysqlcppconn include dir = ${CPPCONN_INCLUDES}")

#set cppconn libs

SET(CPPCONN_LIBS ${CPPCONN_ROOT}/lib)

MESSAGE(STATUS "mysqlcppconn link dir = ${CPPCONN_LIBS}")

INCLUDE_DIRECTORIES(${COMMAND_INCLUDES} ${BOOST_ROOT}/include ${CPPCONN_INCLUDES} ${ACE_ROOT}/include)

LINK_DIRECTORIES(${CPPCONN_LIBS} ${ACE_ROOT}/lib)

SET(LOGIC_SOURCES

db_cache_server.cpp

user_handler.cpp

protocol_handler.cpp

connection_pool.cpp

pool_connection.cpp)

#set output path

SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

MESSAGE(STATUS "library output path = ${LIBRARY_OUTPUT_PATH}")

ADD_LIBRARY(gamelogic SHARED ${LOGIC_SOURCES})

TARGET_LINK_LIBRARIES(gamelogic ACE mysqlcppconn)

2.讲解

名称 功能简介 功能详细介绍(大部分是摘抄收集而来) 备注

1 LINK_DIRECTORIES(${CPPCONN_LIBS} ${ACE_ROOT}/lib) 空格,用来分隔开,即表示并列的功能 CMake语法介绍CMake语法非常简单,包含注释、命令和空格。以#开头的行为注释行,命令则由命令名、括号及以空格进行分隔的参数组成。命令可以是诸如 add_library这样的内置命令,也可以是子定义的宏或者函数。CMake的输入是主目录下的CMakeLists.txt文件,该文件可以使用 include或者add_directory命令添加其它的输入文件。命令命令的形式如下:command (args ...)其中command为命令名,args为空格分隔的参数列表,如果参数中包含空格,使用双引号引起来。命令不区分大小写。lists and strings. CMake的基本数据类型为字符串,字符串又可以组成list类型,有两种方式:一种通过分号分隔,一种通过空格分隔。比如以下例子给VAR赋了同样的值:set(VAR a;b;c)    set(VAR a b c)

例如add_executable (helloDemo demo.cxx demo_b.cxx)  #将cxx编译成可执行文件helloDemo

2 ADD_LIBRARY(gamelogic SHARED ${LOGIC_SOURCES}) 生成gamelogic的动态库.参数3的变量是库文件里所有的程序文件(.h+.cpp).

关于Linux的动态库,写法上与windows不太一样.详见补充说明的问题2 ADD_LIBRARY语法        ADD_LIBRARY(libname     [SHARED|STATIC|MODULE]           [EXCLUDE_FROM_ALL]                 source1 source2 ... sourceN)你不需要写全 libhello.so,只需要填写 hello 即可,cmake 系统会自动为你生成libhello.X类型有三种:SHARED,动态库STATIC,静态库MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。

3 TARGET_LINK_LIBRARIES(gamelogic ACE mysqlcppconn) 添加这3个链接库:

1:gamelogic

2:ACE

3:mysqlcppconn target_link_libraries:添加链接库,上面有介绍

1.gamelogic是自定义的动态链接库

2.ACE在servers\depends\ACE_wrappers\lib目录下能看到动态库libACE.so这个库(也有静态库libACE.la,此处用的是动态库)

3.mysqlcppconn在servers\depends\mysqlcppconn\lib目录下能看到动态库libmysqlcppconn.so

--------------以下是补充说明,仅供补充一些注意的问题

1.补充说明

第1个问题:必须加载动态链接库,否则报错

1.为什么不加载会报错?

摘抄:(网址:http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/index.html)

因为再定位完成后,动态链接器就会允许任何加载的共享程序来执行可选的初始化代码。该函数允许库来初始化内部数据并备之待用。这个代码是在上述 ELF 映像的 .init 部分中定义的。在卸载库时,它还可以调用一个终止函数(定义为映像的 .fini 部分)。当初始化函数被调用时,动态链接器会把控制权转让给加载的原始映像。

------------

错误原因:因为它会自动调用.init,结束时也会自动调用.fini,一些初始化操作都放在.init中了.所以程序未能初始化,肯定会错了

如图所示

39668452_1.jpg

2.报什么错?

开客户端测试程序,直接不鸟人.如图所示

39668452_2.jpg

----------------------------------------------------第4个是cmake的一些基本命令,供参考----------------------------------------------------

1.cmake的2种构建方式(Debug与Release)

cmake -DCMAKE_BUILD_TYPE=Debug ..

cmake -DCMAKE_BUILD_TYPE=Release ..

2.编译  make

3.清理解决方案(windows这样称呼)   make clean

此时,会清空build目录下的可执行程序与其它少量的一些文件,不会全部清掉

目前没有发现必须得删除build目录才能正常编译的(有的话会更新出来),通常make clean足够

4.查看编译过程    cmake -LA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值