我有一些遗留代码,其中包含一些使用全局变量的构造函数注册自身的单例类。这是一个很大的代码库,被编译成一个可执行文件。我尝试组织代码库并将代码重新分组到库中。当前代码的一个最小示例是
主程序
int main(int argc, char *argv[])
{
return 0;
}
哈希.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 静态库)吗?这是未定义的行为吗?