AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76925604
Accepted
jabaa
jabaa
Asked: 2023-08-18 07:15:20 +0800 CST2023-08-18 07:15:20 +0800 CST 2023-08-18 07:15:20 +0800 CST

Por que o construtor de uma variável global não é chamado em uma biblioteca?

  • 772

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.ae 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?

c++
  • 1 1 respostas
  • 418 Views

1 respostas

  • Voted
  1. Best Answer
    Sam Varshavchik
    2023-08-18T09:18:19+08:002023-08-18T09:18:19+08:00

    A diferença deve ser descrita na documentação do seu vinculador, bem como em livros introdutórios, suponho, que explicam o que são bibliotecas estáticas, como funcionam e como usá-las.

    Sem bibliotecas estáticas na imagem: quando as unidades de tradução são explicitamente vinculadas, tudo nelas se torna parte do executável.

    Em seu primeiro exemplo, ambos main.cppe hash.cppestão vinculados ao mcveexecutável e, na inicialização, o único objeto global de hash.cppé construído. O fim.

    A vinculação com uma biblioteca estática não inclui, repito, não inclui tudo, desde a biblioteca estática até o executável. Não é assim que as bibliotecas estáticas funcionam. Somente unidades de tradução individuais na biblioteca estática que exportam símbolos indefinidos nas unidades de tradução vinculadas à biblioteca estática -- apenas essas unidades de tradução são vinculadas ao executável (é um pouco mais complicado, na verdade, mas toda a complexidade é imaterial para os propósitos desta questão, apenas confundiria as coisas, então trabalharemos apenas com esta descrição simplificada). Essa é uma característica definidora do que são as bibliotecas estáticas.

    Um exame muito, muito próximo do código mostrado resulta em uma profunda descoberta de que não há símbolos indefinidos ou não resolvidos main.cppexportados por hash.cpp. Portanto, hash.cpp não é vinculado ao executável . O objeto global é definido para hash.cppque o executável final não termine com nenhum objeto global que precise ser construído quando o programa for executado. O fim.

    Não é que as regras de inicialização ou construção mudem para bibliotecas estáticas. É porque não há nada para inicializar ou construir.

    • 9

relate perguntas

  • Por que os compiladores perdem a vetorização aqui?

  • Erro de compilação usando CMake com biblioteca [fechada]

  • Erro lançado toda vez que tento executar o premake

  • Como criar um tipo de octeto semelhante a std::byte em C++?

  • Somente operações bit a bit para std::byte em C++ 17?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve