cyclonedds开源代码在Linux系统上编译生成可执行文件的详细步骤,此为C语言版本,并且是在X86平台上编译,C++版本随后安排上
此系列总共有四篇,分别为C、C++版本的Cyclonedds在X86、ARM平台上进行编译
1 远程仓库CycloneDDS源码下载
git clone https://github.com/eclipse-cyclonedds/cyclonedds.git
注:可从远程仓库git clone
,也可以直接进入github官网下载
CyloneDDShttps://github.com/eclipse-cyclonedds/cyclonedds.git
2 创建build目录
下载CycloneDDS源码之后,在其根目录下打开Linux命令终端:mkdir build
目的:用于存放编译过程中各种生成文件,主要是用来存放MakeFile
文件以及可执行文件
3 进入build目录
Linux终端输入:cd ./build
注:一般我们在build目录下进行编译,可以将过程中的生成文件禁锢于此目录下。在此目录下cmake ..
创建MakeFile文件之后利用make
命令进行编译处理。
cmake ..
:两个小点的原因是因为,源码中的CMakeLists.txt
在新建的build目录的上层目录中,要通过cmake ..
生成MakeFile文件最后编译出可执行文件来必须要在CMakeLists.txt
同级目录下使用cmake ..
4 指定安装路径前缀
Linux终端输入:cmake -D CMAKE_INSTALL_PREFIX=<install-location> ..
例如:cmake -D CMAKE_INSTALL_PREFIX=/home/ubuntu/Documents/.../install_dds
其中,install_dds
在源码根目录下新建的目录,用于存放执行install
安装命令时生成的文件
命令解析:
cmake -D CMAKE_INSTALL_PREFIX=<install-location> ..
Cmake -D
:称为CMake编译选项,常见的有-G、-D
等。因为CMake是根据当下环境中不同的编译器来生成不同的中间项文件,所以-D的作用就是告诉Cmake在cmake -D
后面要配置一些参数了,如:
cmake -D CMAKE_BUILD_TYPE=debug
:指定CMake的构建版本,默认情况下构建的版本是release,所以在指定debug之后才能构建出供调试的版本。
其中CMAKE_INSTALL_PREFIX
是CMake的内置变量,也称为预定义变量,是用来设置安装路径前缀的,即用于指定CMake在执行install
命令时候的位置,如果不进行指定,则使用默认位置/usr/local
(Linux系统下的默认路径,windows应该会有不同)安装CycloneDDS目录以及产生的构建文件等。
故,cmake -D
与CMAKE_INSTALL_PREFIX
等内置变量是联合使用的,起作用就是后者的作用,联合起来只是语法的需要。
当有多个需要的参数时,写成cmake -D XXX -D XXX ....... -D XXX
即可。
结果演示:
指定CMake安装路径
图中:cyclonedds-master是clone下来的源码包,build是在其下新建的包,终端命令的意思是在cyclonedds-master目录下新建install_dds目录作为安装目录
显示 configuration done 、generation done表示配置路径成功
此时我们打开build目录,生成MakeFile文件以及一些过程文件,如下图所示:
5 编译 cmake --build
Linux终端输入:cmake --build .
,点的目的是因为MakeFile文件在同级目录,此为编译时的重要文件。与make效果相同,cmake --build .的形式可以跨平台,不需要考虑生成器类型。如果生成器是 Ninja ,那么直接使用make就不生效了。
编译开始:
显示100%并且不报错表明编译完成
6 编译完成后进行安装
Linux终端输入:cmake --build . --target install
开始安装:
安装成功,安装结果均在install_dds中
安装完成之后会将所有的的内容都拷贝到自己选择的安装路径下,即
/Documents/test_clone/test001/cyclonedds-master/install_dds
在此目录下输入ls -a
指令,会出现四个目录:lib、bin、include、share,其中share文件有时产生不成功,无妨!
7 版本构建并编译
通过配置构建出debug版本并且进行编译
Linux终端输入:cmake -D CMAKE_BUILD_TYPE=Debug -D BUILD_TESTING=ON ..
其中CMAKE_BUILD_TYPE=Debug
构建debug版本
BUILD_TESTING=ON
构建测试套件(需要CUnit单元测试框架工具存在)
报错:not find CUnit缺少测试套件
因为cmake -D BUILD_TESTING=ON ..
需要CUnit单元测试工具
注意:此处路径可能不同,是为了验证并解决错误,不必介怀,等问题解决之后后面的步骤便会相同,屏幕前的你在看时权当一样便可
Ubuntu下Cunit安装需要root权限,但可以通过Linux系统镜像源下载
注:安装CUnit之前首先需要安装libtool、libtool-bin等,因为企业不能进入外网(如果是有网的情况,直接命令行下载就行了),所以只能离线安装,较为麻烦,各软件之间可能存在依赖关系,版本也不好控制,所以采用镜像源下载最为稳妥。
7.1 虚拟机网络桥接
首先在添加镜像源之前完成主机与Linux系统网络桥接操作:
- 电脑连接网线,接通内网
- 通过设置虚拟机网卡,连通主机与虚拟机之间的网络
在虚拟机菜单栏找到【虚拟机】-【设置】。添加网络适配器,选择桥接模式,将计算机网络桥接到虚拟机上面
- 计算机命令行输入ipconfig查看主机IP地址,在Linux终端如果ping通,则说明网络桥接成功
例如:主机IP为10.32.78.000
ping 10.32.78.000,如下图所示,则网络桥接成功。
7.2 镜像源添加
在Linux根目录下找到/etc/apt
文件中的sources.list
,vim sources.list(vi /etc/apt/sources.list)
进入之后粘贴以下镜像源地址(注:公司内部的镜像源一般是内定的,自己下载的加入不了)
要输入的镜像源如下(公司内部镜像源不宜公开,先将国内的一些镜像源罗列于此):
【Ubuntu换源】Ubuntu换国内镜像源
通过上述步骤完成更新镜像源操作之后,运行如下指令进行刷新:sudo apt update
7.3 CUnit单元测试工具安装
首先说明一点,如果这种方法搞不定,那就试试这种离线安装的方法,包过篇,这篇离线安装较为麻烦一点,但是一定能成功,童叟无欺Linux(Ubuntu版本)上离线安装CUnit来解决Could not find CUnit(missing:CUNIT_LIBRARY)
前面Could not find CUint报错的命令为:cmake -D CMAKE_BUILD_TYPE=Debug -D BUILD_TESTING=ON ..
,但一引起报错的仅为cmake -D BUILD_TESTING=ON ..
部分,下面是验证结果:
下面安装CUnit单元测试工具,通过指令进行安装:
sudo apt install libtool libcunit1 libcunit1-dev libcunit1-doc libcunit1-ncurses libcunit1-ncurses-dev
因为此条指令安装东西较多,有可能不会一次性全部成功,若没有一次成功,便根据报错信息继续安装即可,若libcunit1 libcunit1-dev
没有安装成功,我们继续进行安装即可。
其中有哪项没有完成安装报错,单个安装也可
显示下图所示信息表示CUnit安装前的准备工作已经完成
下面安装CUnit:通过指令:sudo apt install *cunit*
:
如果在此过程中发生报错显示前面的安装选项没有完成,可通过之前图中所示的指令进行再次安装,显示以下内容证明CUnit安装成功。
两条指令同时执行:
cmake -D CMAKE_BUILD_TYPE=Debug -D BUILD_TESTING=ON ..
如果显示如下图所示,则指令执行成功。
7.4 编译构建的版本
在Linux终端输入:cmake --build .
进行编译,显示结果如下:
表明新构建的版本编译成功!
7.5 ctest进行单元测试
CMake和ctest可以帮助我们进行项目的构建与测试,前面已经完成项目的构建,接下来使用ctest进行单元测试,此过程会稍微慢一些。
在Linux终端输入:ctest
,显示结果如下。
100% tests passed!
证明单元测试全部通过,此步骤完成。
8 构建和运行往返实例(有个特别需要注意的点)
此步骤的目的是:构建和运行测量延迟的示例程序
cyclonedds里面已经有现成的实例供我们参考,在根目录下的example目录下面,我们打开此目录,此目录下有CMakeLists.txt文件以及一些其他的文档,我们需要在此目录(example目录)下编译构建出RoundtripPong
和RoundtripPing
两个可执行文件来。
RoundtripPing / RoundtripPong
,对应examples/roundtrip
,功能为尽最大能力ping pong,pong端接收后将数据返回,ping端指定数据包大小,并记录传输数据包个数及延时分布。
我们可以看到cyclonedds-master包下的example目录下有很多文件,包括CMakeLists.txt等,其中我们要构建的可执行文件所需要的源文件等就在examples/roundtrip
,
接下来,在example/roundtrip目录下新建build目录,在build目录下终端输入cmake ..
来此产生MakeFile文件,用于make编译,但是输入cmake ..
之后会报错,如下:
此时,需要在cmake ..
指令中指定cyclonedds的安装路径,指令与显示结果如下:
cmake -D CMAKE_PREFIX_PATH=<安装dds目录的绝对路径> ..
这里与前面是对应的,请注意,在第四步中我们指定了安装路径前缀
cmake -D CMAKE_INSTALL_PREFIX= ..
在这一步也是同样的,cmake -D CMAKE_PREFIX_PATH= ..
如果在第四步中自己指定了安装路径,此处一定要写正确。
写正确之后运行结果应该如下图所示:
前面指定的安装目录是:
cmake -D CMAKE_INSTALL_PREFIX=/home/ubuntu/Documents/test_clone/test001/cyclonedds-master/install_dds ..
那么此处就为:
cmake -D CMAKE_PREFIX_PATH=/home/ubuntu/Documents/test_clone/test001/cyclonedds-master/install_dds ..
此时我们打开build目录,已经产生了MakeFile文件,终端命令行输入cmake --build .进行编译,完成之后产生RoundtripPong和RoundtripPing两个可执行文件如下图所示:
上述步骤完成之后,重启一个终端,在build目录下打开,并启动将响应 ping 的应用程序
Linux终端输入:./RoundtripPong
在另一个终端上(同样在build
目录下)启动将发送 ping 的应用程序
Linux终端输入:./RoundtripPing 0 0 0
显示如下图所示内容,则表示成功。
完结撒花~~~么么哒~