O que é a biblioteca de tempo de execução C?

157

O que realmente é uma biblioteca de tempo de execução C e para que é usada? Eu estava pesquisando, pesquisando no Google como um demônio, mas não consegui encontrar nada melhor que o da Microsoft: "A biblioteca de tempo de execução da Microsoft fornece rotinas de programação para o sistema operacional Microsoft Windows. Essas rotinas automatizam muitas tarefas comuns de programação que não são fornecidas pela Microsoft. as linguagens C e C ++ ".

OK, entendi, mas por exemplo, o que está acontecendo libcmt.lib? O que isso faz? Eu pensei que a biblioteca padrão C fazia parte do compilador C. Então, libcmt.liba implementação do Windows das funções da biblioteca padrão C funciona no win32?

B.Gen.Jack.O.Neill
fonte

Respostas:

71

Sim, libcmt é (uma das várias) implementações da biblioteca padrão C fornecida com o compilador da Microsoft. Eles fornecem versões "debug" e "release" de três tipos básicos de bibliotecas: thread único (sempre vinculado estaticamente), vinculado estaticamente multithread e vinculado dinamicamente multi-thread (embora, dependendo da versão do compilador que você está algumas delas podem não estar presentes).

Portanto, no nome "libcmt", "libc" é o nome (mais ou menos) tradicional da biblioteca C. O "mt" significa "multiencadeado". Uma versão "debug" teria um "d" adicionado ao final, fornecendo "libcmtd".

No que diz respeito às funções que ele inclui, o padrão C (parte 7, se você se importa) define um conjunto de funções que uma implementação (hospedada) em conformidade deve fornecer. A maioria dos fornecedores (incluindo a Microsoft) adiciona várias outras funções (por compatibilidade, para fornecer recursos que as funções padrão não abordam etc.) Na maioria dos casos, também conterá algumas funções "internas" usadas pelo compilador mas não normalmente pelo usuário final.

Se você deseja obter uma lista completa das funções em "libcmt" (para usar seu exemplo), você pode abrir um dos prompts de comando do Visual Studio (normalmente em "Ferramentas do Visual Studio"), alterne para o diretório em que suas bibliotecas estavam instalado e digite algo como: lib -list libcmt.libe gerará uma lista ( longa ) dos nomes de todos os arquivos de objeto nessa biblioteca. Elas nem sempre correspondem diretamente aos nomes das funções, mas geralmente dão uma idéia. Se você deseja examinar um arquivo de objeto específico, pode usar lib -extractpara extrair um desses arquivos de objeto e depois dumpbin /symbols <object file name>encontrar quais funções estão nesse arquivo de objeto específico.

Jerry Coffin
fonte
37
Você não disse o que é a "biblioteca de tempo de execução C" !!
precisa saber é o seguinte
4
@entropy: Certamente me parece como eu, mas a resposta curta é que é uma coleção de funções, muitas (mas não necessariamente todas) especificadas na parte 7 do padrão C.
Jerry Coffin
3
Esta resposta implica que as bibliotecas C são apenas parte das cadeias de ferramentas do compilador. Não é preciso.
jiggunjer
@JerryCoffin Pergunta: então a strcpyfunção da biblioteca padrão C, por exemplo, teria sua implementação na biblioteca de tempo de execução ou apenas seu código em arquivos .c normais?
forumulator
@forumulator: normalmente haverá código-fonte em um arquivo .c que é compilado para produzir a biblioteca padrão adequada (a ..dll, lib, .a, .so ou o que for aplicável ao sistema que você está usando) .
Jerry Coffin
55

A princípio, devemos entender o que é uma biblioteca de tempo de execução; e pense no que isso poderia significar por "Microsoft C Runtime Library".

consulte: http://en.wikipedia.org/wiki/Runtime_library

Publiquei a maior parte do artigo aqui, pois ele pode ser atualizado.

Quando o código-fonte de um programa de computador é traduzido para o respectivo idioma de destino por um compilador, isso causa um aumento extremo do código do programa se cada comando no programa e toda chamada para uma função interna causar a geração no local do respectivo código de programa completo no idioma de destino sempre. Em vez disso, o compilador geralmente usa funções auxiliares específicas do compilador na biblioteca de tempo de execução que geralmente não são acessíveis aos programadores de aplicativos. Dependendo do fabricante do compilador, a biblioteca de tempo de execução às vezes também conterá a biblioteca padrão do respectivo compilador ou estará contida nela.

Além disso, algumas funções que podem ser executadas apenas (ou são mais eficientes ou precisas) em tempo de execução são implementadas na biblioteca de tempo de execução, por exemplo, alguns erros lógicos, verificação de limites de matriz, verificação dinâmica de tipo, manipulação de exceção e, possivelmente, funcionalidade de depuração. Por esse motivo, alguns erros de programação não são descobertos até que o programa seja testado em um ambiente "ativo" com dados reais, apesar da verificação sofisticada em tempo de compilação e testes de pré-lançamento. Nesse caso, o usuário final pode encontrar uma mensagem de erro em tempo de execução.

Normalmente, a biblioteca de tempo de execução realiza muitas funções acessando o sistema operacional. Muitas linguagens de programação possuem funções internas que não precisam necessariamente ser realizadas no compilador, mas podem ser implementadas na biblioteca de tempo de execução. Portanto, a fronteira entre a biblioteca de tempo de execução e a biblioteca padrão depende do fabricante do compilador. Portanto, uma biblioteca de tempo de execução é sempre específica do compilador e específica da plataforma.

O conceito de uma biblioteca de tempo de execução não deve ser confundido com uma biblioteca de programas comum como a criada por um programador de aplicativos ou entregue por terceiros ou por uma biblioteca dinâmica, ou seja, uma biblioteca de programas vinculada em tempo de execução. Por exemplo, a linguagem de programação C requer apenas uma biblioteca de tempo de execução mínima (geralmente chamada crt0), mas define uma grande biblioteca padrão (chamada biblioteca padrão C) que cada implementação deve fornecer.

fantágons
fonte
3
A frase destacada como uma maneira de distinguir da biblioteca padrão é a primeira resposta precisa e concisa que eu já vi não qualificada com "a maioria" ou "algumas vezes".
Nik.shornikov 17/03/19
@ nik.shornikov: Isso ocorre porque outras descrições tentam ser mais precisas. Embora seja verdade que uma biblioteca padrão seja tipicamente específica para um compilador e uma plataforma, isso nem sempre é verdade. Apenas por exemplo, pelo menos algumas versões do Mingw e do compilador C ++ da Intel para Windows usaram a biblioteca padrão da Microsoft em vez de fornecer a sua própria. Da mesma forma, o Clang no Linux pode ser (e geralmente é) instalado para usar a biblioteca padrão em uma instalação existente do gcc, em vez de instalar outra para si.
Jerry Coffin
Estou razoavelmente certo de que é possível escrever implementações das bibliotecas padrão C e C ++ que são portáveis ​​em qualquer plataforma que suporte POSIX.
Jerry Coffin
20

Eu mesmo perguntei isso e estava machucando meu cérebro por algumas horas. Ainda não encontrou nada que realmente faça sentido. Todo mundo que escreve algo em um tópico não é capaz de realmente "ensinar". Se você deseja ensinar alguém, use o idioma mais básico que uma pessoa entende, para que ele não precise se preocupar com outros tópicos ao lidar com um tópico. Então, eu cheguei a uma conclusão que parece se encaixar bem em todo esse caos.

Na linguagem de programação C, todo programa começa com a função main (). Outros idiomas podem definir outras funções onde o programa é iniciado. Mas um processador não conhece main (). Um processador conhece apenas comandos predefinidos, representados por combinações de "0" e "1".

Na programação do microprocessador, sem um sistema operacional subjacente (Microsoft Windows, Linux, MacOS, etc.), é necessário informar explicitamente ao processador por onde começar, definindo o ProgrammCounter (PC) que itera e salta (loops, chamadas de função) dentro os comandos conhecidos pelo processador. Você precisa saber o tamanho da RAM, definir a posição da pilha de programas (variáveis ​​locais), bem como a posição da pilha (variáveis ​​dinâmicas) e a localização das variáveis ​​globais (por exemplo, SSA) ?) dentro da RAM. Um único processador pode executar apenas um programa por vez.

É aí que o sistema operacional entra. O próprio sistema operacional é um programa executado no processador. Um programa que permite a execução de código personalizado. Executa vários programas por vez, alternando entre os códigos de execução dos programas (que são carregados na RAM). Mas o sistema operacional É UM PROGRAMA, cada programa é escrito de maneira diferente. Simplesmente colocar o código do seu programa personalizado na RAM não o executará, o sistema operacional não o saberá. Você precisa chamar funções no sistema operacional que registra seu programa, informar ao sistema operacional quanta memória o programa precisa, onde está localizado o ponto de entrada no programa (a função main () no caso de C). E é isso que eu localizo na RuntimeLibrary e explica por que você precisa de uma biblioteca especial para cada sistema operacional,

Isso também explica por que NÃO está vinculado dinamicamente em tempo de execução como arquivos .dll, mesmo que seja chamado RUNTIMELibrary. A RuntimeLibrary precisa estar vinculada estaticamente, porque é necessária na inicialização do seu programa. A RuntimeLibrary injeta / conecta seu programa personalizado em / para outro programa (o sistema operacional) em RUNTIME. Isso realmente causa alguns problemas cerebrais ...

Conclusão: RUNTIMELibrary é uma falha na nomeação. Pode ser que não tenha existido .dll (vinculação em tempo de execução) nos primeiros tempos e a questão de entender a diferença simplesmente não existia. Mas mesmo que isso seja verdade, o nome é mal escolhido.

Os nomes melhores para a RuntimeLibrary podem ser: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

espero que eu tenha acertado, para aplausos de correção / expansão.

Estrondo
fonte
1
Ainda não entendi a ideia. Por que um programa precisa de algo no tempo de execução? Por que o código binário não pode ser executado, 100% sozinho, sem nada suportando-o em tempo de execução? Ou, em outras palavras: é possível ter um código que seja executado 100% sem nada (incluindo o sistema operacional)?
MarcioAB
5
Em teoria, um programa não precisa de um RTL. No entanto, como o seu programa exibirá o resultado ou obteria qualquer entrada ou solicitação de memória sem alguma cooperação do sistema operacional?
SN
16

C é uma linguagem e, em sua definição, não precisa haver nenhuma função disponível para você. Sem E / S, sem rotinas matemáticas e assim por diante. Por convenção, há um conjunto de rotinas disponíveis para você vincular ao seu executável, mas você não precisa usá-las. Isso é, no entanto, uma coisa tão comum a ser feita que a maioria dos vinculadores não pede mais que você vincule às bibliotecas de tempo de execução C

Há momentos em que você não os deseja - por exemplo, ao trabalhar com sistemas embarcados, pode ser impraticável ter malloc, por exemplo. Eu trabalhava na incorporação de PostScript em impressoras e tínhamos nosso próprio conjunto de bibliotecas de tempo de execução que eram muito mais felizes em sistemas embarcados, por isso não nos incomodamos com o "padrão".

plinto
fonte
11
Na verdade, os padrões C descrevem dois tipos de ambientes C - "independentes" e "hospedados" - e, nos ambientes hospedados, as funções descritas nos padrões são definidas como disponíveis. Nos sistemas incorporados, o ambiente C é normalmente independente, de modo que você pode não ter as rotinas da biblioteca ou evitar o uso de algumas e usar suas próprias substituições.
10

A biblioteca de tempo de execução é aquela que é compilada automaticamente para qualquer programa em C que você executa. A versão da biblioteca que você usaria depende do seu compilador, plataforma, opções de depuração e opções de multithreading.

Uma boa descrição das diferentes opções para bibliotecas de tempo de execução: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

Inclui as funções que você normalmente não considera necessárias para chamar uma biblioteca:

  • malloc
  • enum, struct
  • abs, min
  • afirmar

A Microsoft possui uma boa lista de funções da biblioteca de tempo de execução:

http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx

A lista exata de funções varia de acordo com o compilador, portanto, para iOS, você obteria outras funções como dispatch_async () ou NSLog ().

arinmorf
fonte
1
Struct e enum é realmente uma biblioteca de tempo de execução?
decano P
6

Se você usar uma ferramenta como o Dependency Walker em um executável compilado em C ou C ++, verá que uma das DLLs das quais depende é MSVCRT.DLL. Esta é a biblioteca de tempo de execução do Microsoft C. Se você examinar ainda mais o MSVCRT.DLL com o DW, verá que é aqui que todas as funções como printf (), puts (0, gets (), atoi () etc. ficam ativas.


fonte
6
Somente se durante a compilação do executável, o tempo de execução C estiver vinculado dinamicamente. Se estiver vinculado estaticamente, o caminhante da dependência mostrará nada
Eli Bendersky
4

Eu acho que a definição da Microsoft realmente significa:

A implementação da Microsoft da biblioteca de tempo de execução C padrão fornece ...

Andrey
fonte
3

Existem três formas da biblioteca de tempo de execução C fornecida com o SDK do Win32:

* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. 

A edição de 32 bits do Microsoft Visual C ++ também contém esses três formulários; no entanto, o CRT em uma DLL é chamado MSVCRT.LIB. A DLL é redistribuível. Seu nome depende da versão do VC ++ (ou seja, MSVCRT10.DLL ou MSVCRT20.DLL). Observe no entanto, que o MSVCRT10.DLL não é suportado no Win32s, enquanto o CRTDLL.LIB é suportado no Win32s. MSVCRT20.DLL vem em duas versões: uma para Windows NT e outra para Win32s.

consulte: http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

Michael
fonte