最近因为项目需求重新拾起了 C++,迁移到 x86_64 Linux 平台上之后 CMake 实在是一个必不可少的技能点,以下是一个分步教程,涵盖了CMake的常见构建系统用例,内容翻译自官网教程。

Step1 A Basic Starting Point

最基本的就是将一个源代码文件编译成一个可执行程序。对于一个简单的工程来说,两行的CMakeLists.txt文件就足够了。这将是我们教程的开始。CMakeLists.txt文件看起来会像这样:

cmake_minimum_required (VERSION 2.6)
project (Tutorial)
add_executable(Tutorial tutorial.cxx)

注意,在这个例子中,CMakeLists.txt都是使用的小写字母。事实上,CMake命令是大小写不敏感的,你可以用大写,也可以用小写,也可以混写。tutorial.cxx源码会计算出一个数的平方根。它的第一个版本看起来非常简单,如下:

Continue reading

Waxing Gibbous Moon Above Earth's Limb

Waxing Gibbous Moon Above Earth’s Limb

placeHolder

随着宇宙中暗能量膨胀速度的加快,
许多遥远的星星每天都在更快地离我们远去,
直到某一天,
相互远离的速度最终超过光速,
恒星的光再也无法传到地球,
繁星消失。

The stars disappear.

— MorningRocks

Systemd integration

Systemd is now included in both the centos:7 and centos:latest base containers, but it is not active by default. In order to use systemd, you will need to include text similar to the example Dockerfile below:

FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

Dockerfile for systemd base image

This Dockerfile deletes a number of unit files which might cause issues. From here, you are ready to build your base image.

$ docker build --rm -t local/el7-systemd .

Example systemd enabled app container

In order to use the systemd enabled base container created above, you will need to create your Dockerfile similar to the one below.

FROM local/el7-systemd
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]

Build this image:

$ docker build --rm -t local/el7-systemd-httpd .

Running a systemd enabled app container

In order to run a container with systemd, you will need to mount the cgroups volumes from the host. Below is an example command that will run the systemd enabled httpd container created earlier.

$ docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/el7-systemd-httpd

This container is running with systemd in a limited context, with the cgroups filesystem mounted. There have been reports that if you’re using an Ubuntu host, you will need to add -v /tmp/$(mktemp -d):/run in addition to the cgroups mount.

The Dawn of a New Era in Human Spaceflight

Sailing Over the Caribbean From the International Space Station

placeHolder

没有真正意义上的亲密,
我们手牵手时感受到的触觉,不过是彼此皮肤上的原子间的斥力罢了。

Atomic Force.

— MorningRocks

linux 下 g++ 编译程序时,-I, -L, -l 的作用

g++ -o compress  compress.cpp  \
  -I/home/include/ \
  -L/lib/ \
  -lz

1. -I (Capital i)

编译程序按照 -I 指定的路进去搜索头文件。

-I/home/include/ 表示将 -I/home/include/ 目录作为第一个寻找头文件的目录,寻找的顺序是:
/home/include/ –>/usr/include–>/usr/local/include

2. -L

表示:编译程序按照 -L 指定的路进去寻找库文件,一般的在 -L 的后面可以一次用 -l 指定多个库文件。

-L/lib/ 表示到 /lib/ 目录下找库文件

3. -l (lowercase L)

表示:编译程序到系统默认路进搜索,如果找不到,到当前目录,如果当前目录找不到,则到 $LD_LIBRARY_PATH 等环境变量置顶的路进去查找,如果还找不到,那么编译程序提示找不到库。

本例子使用的是gunzip库,库文件名是libz.so,库名是z。很容易看出,把库文件名的头lib和尾.so去掉就是库名了。