CMakeLists.txt源文件顺序不当导致全局变量不能正确初始化
我现在一直用cmake来生成Makefile文件, 然后才是编译代码, 有一个project一直都是能够正常编译并且运行结果也正确的, 前两天我小改动了下代码发现运行的结果不正常了, 主要体现在一个全局变量没能初始化, 下面简要分析一下原因。
project 文件组织结构是这样的
. |
global.cpp 文件里面定义了一个socket类的全局对象g_socket, main函数使用这个全局对象g_socket的时候发现并未能按照预期初始化g_socket的构造函数, 进而程序崩溃了.那是为什么会没能初始化g_socket呢, 我们先看看CMakeLists.txt的内容:
cmake_minimum_required(VERSION 3.12) |
很简单的CMakeLists.txt, 细心一点你会发现问题出在这个src变量对应的源代码文件顺序上, gloabal.cpp文件在socket.cpp文件之前, 所以定义全局对象g_socket的时候因为找不到g_socket的构造函数的符号连接, 进而采用默认的构造函数. 这个问题只需要把socket.cpp的位置换到最前面去就可以解决.