Eu tenho algum código legado com algumas classes singleton que se registram usando construtores de variáveis globais. É uma grande base de código, compilada em um executável. Tentei organizar a base de código e reagrupar o código em bibliotecas. Um exemplo mínimo do código atual é
main.cpp
int main(int argc, char *argv[])
{
return 0;
}
Hash.cpp
#include <iostream>
class Hash
{
public:
Hash()
{
std::cout << "Hash\n";
}
};
Hash a;
e a configuração de compilação atual é
CMakeLists.txt
cmake_minimum_required(VERSION 3.26)
project(mcve)
add_executable(mcve main.cpp Hash.cpp)
Construindo o código e executando as impressões executáveis
Hash
Eu modifiquei a configuração de compilação para
cmake_minimum_required(VERSION 3.26)
project(mcve)
add_library(Hash Hash.cpp)
add_executable(mcve main.cpp)
target_link_libraries(mcve Hash)
Isso cria uma biblioteca estática libHash.a
e a vincula ao executável. Compilar o mesmo código e executar o executável não imprime nada. Por que a diferença e onde é descrita? Faz parte do padrão C++ ou do compilador? É específico do sistema operacional (bibliotecas estáticas do Linux)? É um comportamento indefinido?