CMakeLists.txt源文件顺序不当导致全局变量不能正确初始化

我现在一直用cmake来生成Makefile文件, 然后才是编译代码, 有一个project一直都是能够正常编译并且运行结果也正确的, 前两天我小改动了下代码发现运行的结果不正常了, 主要体现在一个全局变量没能初始化, 下面简要分析一下原因。

project 文件组织结构是这样的

.
├── CMakeLists.txt
├── global.cpp
├── global.h
├── main.cpp
├── socket.cpp
└── socket.h

0 directories, 6 files

global.cpp 文件里面定义了一个socket类的全局对象g_socket, main函数使用这个全局对象g_socket的时候发现并未能按照预期初始化g_socket的构造函数, 进而程序崩溃了.那是为什么会没能初始化g_socket呢, 我们先看看CMakeLists.txt的内容:

cmake_minimum_required(VERSION 3.12)

set(src
global.cpp
main.cpp
socket.cpp)

add_executable(for-test main.cpp)

很简单的CMakeLists.txt, 细心一点你会发现问题出在这个src变量对应的源代码文件顺序上, gloabal.cpp文件在socket.cpp文件之前, 所以定义全局对象g_socket的时候因为找不到g_socket的构造函数的符号连接, 进而采用默认的构造函数. 这个问题只需要把socket.cpp的位置换到最前面去就可以解决.