我有一些遗留代码,其中包含一些使用全局变量的构造函数注册自身的单例类.这是一个很大的代码库,它被编译成一个可执行文件.我已经try 组织代码库,并将代码重新组合到库中.当前代码的最小示例如下
Main.cpp
int main(int argc, char *argv[])
{
return 0;
}
Hash.cpp
#include <iostream>
class Hash
{
public:
Hash()
{
std::cout << "Hash\n";
}
};
Hash a;
而当前的构建配置是
CMakeLists.txt
cmake_minimum_required(VERSION 3.26)
project(mcve)
add_executable(mcve Main.cpp Hash.cpp)
构建代码并运行可执行文件打印
Hash
我已经将构建配置修改为
cmake_minimum_required(VERSION 3.26)
project(mcve)
add_library(Hash Hash.cpp)
add_executable(mcve Main.cpp)
target_link_libraries(mcve Hash)
这创建了静态库libHash.a
并将其链接到可执行文件.编译相同的代码并运行可执行文件不会打印任何内容.为什么会有不同,在哪里有描述?它是C++标准的一部分还是编译器的一部分?它是特定于操作系统的(Linux静态库)吗?它是不是未定义的行为?