Ponto V!

Home C/C++ Conceitos Básicos Como Usar Bibliotecas C/C++
Bruno Crivelari Sanches
Como Usar Bibliotecas C/C++Imprimir
Escrito por Bruno Crivelari Sanches

No artigo “Compilação de programas C/C++” vimos como funciona a compilação de programas C/C++, agora vamos ver como são organizadas as bibliotecas, os diferentes tipos de bibliotecas e por fim um exemplo de como utilizar uma biblioteca.

Visão Geral

O termo biblioteca é utilizado para definirmos coleções de códigos e estruturas de dados que podem ser utilizados na construção de um software. No caso da linguagem C bibliotecas definem funções que podem ser utilizadas pelo programa cliente (ou até mesmo outras bibliotecas) e estruturas de dados, já para C++, além disso uma biblioteca pode definir classes, templates, etc. Existem casos também onde uma biblioteca pode ser apenas arquivos de cabeçalho com macros e/ou funções e classes inline.

No artigo de compilação vimos que os diversos arquivo c/cpp de um programa C/C++ geram arquivos objeto que são unidos e ligados pelo linker para geração do arquivo executável. No caso das bibliotecas, os arquivos são apenas unidos (não necessariamente pelo linker) e é então gerado um arquivo de biblioteca. No caso do Visual C++ são gerados arquivos com extensão ".lib" e ambientes Linux costumam utilizar arquivos com extensão ".a" e com nome começando por "lib". Exemplos:

  • SDL.lib: biblioteca SDL para Visual C++
  • libSDL.a: biblioteca SDL para compilador gcc.

Existe aqui uma sutil diferença entre arquivos "ligados" (linkados) e arquivos unidos. Bibliotecas são apenas arquivos objeto unidos, ou seja, caso uma biblioteca X tenha sido construída utilizando a biblioteca Y, o programador vai precisar de ambas bibliotecas para poder utilizar a biblioteca X, pois o arquivo de biblioteca não inclui as dependências desta.

Além dos arquivos ".lib" ou ".a" as bibliotecas costumar fornecer arquivos header, que são os arquivos ".h" do C/C++. Nestes arquivos os desenvolvedores costumam declarar as funções e as estruturas de dados que a biblioteca fornece ao programador, assim, para utilizar uma biblioteca o programador não precisa re-declarar as funções e estruturas a serem usadas.

Estes dois arquivos são os gerados pelos métodos mais comuns de criação de bibliotecas estáticas (veremos mais a frente bibliotecas dinâmicas). Com o arquivo lib (ou .a, dependendo da plataforma) já é possível utilizar as funções de uma biblioteca, para tal, na hora de linkar nosso programa devemos informar ao linker todos os arquivos lib que o programa precisa.

Bibliotecas Estáticas

Vimos que bibliotecas estáticas são criadas a partir da união de arquivos objeto. Quando um programa utiliza este tipo de biblioteca o programador informa ao linker que este deve utilizar também o arquivo lib quando for procurar pelos símbolos. Lembre-se que durante a ligação, o linker vai procurar em todos arquivos objeto e em todos arquivos "lib" todas as funções e variáveis globais utilizadas pelo programa.

Fluxo de criação de uma biblioteca estática

Vamos imaginar aqui uma biblioteca chamada jogo.lib e que esta possua uma função chamada "CriaJogo", quando colocamos no programa uma chamada para "CriaJogo", o linker procura em todos arquivos objeto do seu programa e nos arquivos lib pela implementação da função. Cedo ou tarde, ele acaba encontrando a definição no arquivo jogo.lib (caso não encontre em lugar nenhum, temos o famoso "linker error"), encontrada a função, o linker copia o código da função e suas dependências para seu arquivo executável. Ele repete isso para todas as funções utilizadas pelo programa e no final terá copiado quase todo (ou todo) o conteúdo do arquivo lib para o programa executável. Podemos perceber então que o programa incorporou o conteúdo da biblioteca e após a geração do executável o arquivo lib já não é mais necessário. A vantagem desse processo é que não é preciso copiar o arquivo "lib" quando se deseja distribuir o executável, mas por outro lado, caso a biblioteca seja atualizada, será preciso gerar um novo executável, dessa forma não é possível atualizar apenas a biblioteca, pois ela foi ligada de forma estática.

Bibiotecas Dinâmicas

As bibliotecas dinâmicas são no caso do Windows as DLLs (Dynamic Link Library) ou os arquivos so (Shared Lbraries) do Linux. As bibliotecas dinâmicas são quase como arquivos executáveis, a diferença mais relevante é que eles não podem ser executados diretamente, mas precisam de que algum outro programe os carregue e invoque suas funções. A geração de uma biblioteca dinâmica requer um "linker", que vai fazer quase o mesmo trabalho que é feito com um executável comum, note então que é preciso informar ao linker todas as bibliotecas que a biblioteca dinâmica requer (sendo estas estáticas ou não) pois a biblioteca dinâmica precisa estar ligada, assim como um executável comum.

A forma mais simples de se utilizar uma biblioteca dinâmica é através de "ligação estática" (sim, bibliotecas dinâmicas podem ser ligadas de forma estática). Neste modo utilizamos no caso do Visual C++ uma "import library" (biblioteca de importação) que é um arquivo lib que contém apenas a lista de funções que uma determinada DLL contém. No caso do Linux, não existe a "import library" ou podemos "assumir" que esta esta dentro do arquivo so, ou seja, fazemos a ligação diretamente com o arquivo "so". Em ambos os casos, o linker vai incluir no executável uma referência para a biblioteca dinâmica e todas as funções que o executável utiliza da biblioteca estarão apenas com stubs, que servem apenas para indicar ao sistema operacional que estas devem ser trocadas por chamadas a bibliotecas dinâmicas.

Fluxo de criação de uma biblioteca dinâmica

Neste modo, quando um programa é executado, o sistema operacional se encarrega de checar quais bibliotecas dinâmicas o programa necessita (utilizando as informações que o linker colocou no executável) e cuida de carregar as bibliotecas dinâmicas. Após ter carregado as bibliotecas o sistema operacional termina o processo de ligação e troca todo os stubs pelos endereços das funções reais. O interessante é que mesmo a ligação ter sido estática, o uso da biblioteca continua sendo dinâmico, permitindo assim trocar a versão de uma biblioteca sem modificar o programa executável.

É possível também utilizar bibliotecas dinâmicas usando uma ligação dinâmica, neste modelo, o programa em tempo de execução chama uma função do sistema operacional (syscall) e pede a este que carregue uma biblioteca dinâmica. Caso a operação ocorra com sucesso, o programa recebe um identificador da biblioteca e pode usar este identificador para requisitar endereços de funções e variáveis globais da biblioteca, podendo assim usar ponteiros para chamar ou acessar esses itens.

Examinando a SDL

Nesta seção, vamos ver um passo a passo de como a SDL é montada, para tal faça o download da SDL 1.2 neste link, o resto deste artigo vai ser baseado no arquivo SDL-devel-1.2.14-VC8.zip. Extraia o arquivo para o diretório de sua preferência e abra o diretório, o conteúdo deve ser semelhante ao abaixo:
Arquivos da SDL
Note que temos três diretórios e alguns arquivos. Os arquivos trazem algumas informações sobre a biblioteca e informações sobre a licença da mesma (que deve ser lida pelo desenvolvedor para certificar-se que esta usando a biblioteca de acordo com as regras desta).

O diretório "docs" inclui a documentação da SDL que serve de referência para o desenvolvedor, já no diretório include temos os arquivos de cabeçalho com a declaração das funções, macros, estruturas de dados e etc, que a biblioteca define.

No diretório lib temos o arquivo SDL.lib e o arquivo SDL.dll, como a SDL se trata de uma biblioteca dinâmica, já podemos deduzir aqui que o arquivo SDL.lib se trata da import library de SDL.dll. Existe também o arquivo SDLmain.lib que é especifico para Windows, este arquivo é uma biblioteca estática que inclui a função WinMain que é usada para que programas compilados no Windows possam apenas definir a função main ao invés da função WinMain.

Esta estrutura de diretórios usado pela SDL é bem comum em bibliotecas C/C++, um diretório chamado “include” com os arquivos de cabeçalho e um diretório “lib” com arquivos lib, as vezes encontra-se também um diretório “bin” onde são colocados dlls e até mesmo arquivos “lib”.

Utilizando a SDL

Nesta seção iremos abordar um exemplo de como configurar o uso da SDL no Visual C++, apesar do exemplo ser baseado em SDL e Visual C++, o processo é similar para outras bibliotecas e o tipo de configuração a ser feito é o mesmo que deve ser feito em outros ambientes.

Vamos então implementar o programa abaixo no Visual C++:

#include <SDL.h>

int main(int, char **)
{
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Quit();

    return 0;
}


Caso não possua o Visual C++, veja neste artigo como instalar: "Como Utilizar o Visual Studio C++".

Primeiramente, vamos criar uma nova solução, no Visual C++, para tal basta acessarmos "File -> New -> Project", selecione "Win32" na caixa "Project Types" e "Win32 Console Application" na caixa "Template". Entre com "HelloSDL" no nome do projeto e clique em Ok:

Criando novo projeto no Visual

Na próxima tela, desligue a opção "Precompiled header", em seguida clique em "Application Settings", marque a opção "Empty project" e selecione "Console application" na área "Application Type", por fim clique em "Finish":
Configurando o novo projeto

O projeto deve ter sido criado, agora clique com o botão direito no nome do projeto ("HelloSDL") no "Solution Explorer" e selecione "Add -> New Item", na janela que se abrir, selecione "C++ File(.cpp)" e entre com um nome para o arquivo:
Criando novo arquivo de codigo fonte

Agora que o arquivo foi criado, se tentarmos compilar este programa teremos um erro de compilação que informa que o arquivo SDL.h não foi encontrado, vamos ver como corrigir isso na próximo item.

Configurando o Ambiente

Vamos ver então como podemos informar ao compilador do Visual C++ onde este pode encontrar os arquivos de cabeçalho e os arquivos lib da SDL. Para os arquivos de cabeçalho, acesse "Tools -> Options", expanda a opção "Projects and Solutions" e selecione VC++ Directories. Na opção "Show Directories for:" selecione "Include Directories" e será mostrada a lista de diretórios onde o Visual procura por arquivos h para todos os projetos. No meu computador a biblioteca foi instalada no diretório "Z:\libs\SDL-1.2.14\", então é preciso entrar com: "Z:\libs\SDL-1.2.14\include":
Adicionando um diretório de include ao Visual

Atenção, caso esteja utilizando o Visual C++ 2010, este processo não irá funcionar, pois esta tela se tornou obsoleto e a forma de configurar o diretório é diferente. Para maiores detalhes, veja o artigo: Configurando o uso de Bibliotecas no Visual 2010.

Com este passo o Visual já vai saber onde procurar os arquivos de h da SDL e se tentarmos compilar o programa novamente teremos agora um erro de ligação informando que as funções da SDL não foram encontradas:

Erros de ligação

Isto é porque o linker ainda não sabe onde encontrar estas funções, então precisamos informar a este onde elas estão. Para tal clicamos novamente no nome do projeto com o botão direito do mouse e selecionamos "Properties", na tela que se abriu expanda a opção "Linker" e selecione "Input", finalmente entre com SDL.lib e SDLmain.lib na opção "Additional Dependencies", como mostrado abaixo:

Adicionando biblioteca ao projeto


Agora se tentarmos compilar temos um novo erro, informando que o arquivo SDL.lib e/ou SDLmain.lib não foram encontrados, isso ocorre porque o linker não sabe onde procurar por ele, para corrigir isso acesse "Tools -> Options", expanda a opção "Projects and Solutions" e selecione “VC++ Directories”. Na opção "Show Directories for:" selecione "Libraries Directories" e será mostrada a lista de diretórios onde o Visual procura por arquivos de biblioteca para todos os projetos. Entre com o diretório lib da SDL (novamente, no meu computador esta foi instalada no diretório Z:\libs\SDL-1.2.14\):

Configurando os diretórios de bibliotecas

Atenção, caso esteja utilizando o Visual C++ 2010, este processo não irá funcionar, pois esta tela se tornou obsoleto e a forma de configurar o diretório é diferente. Para maiores detalhes, veja o artigo: Configurando o uso de Bibliotecas no Visual 2010.


Por fim, clique em Ok e agora o programa deve compilar sem problemas, apenas com um warning. Este aviso (warning) ocorre que por questões de otimizações o Visual C++ vem com diversas implementações da biblioteca padrão, uma para programas que não usam DLLs, outra para programas que usam DLLs e versões de cada uma para programas single thread e multi-thread. Mais informações podem ser vistas no artigo: “Como Utilizar o Visual Studio C++ – Parte 2”.
Para corrigir o problema, precisamos clicar com o botão direito no projeto, selecionar “Properties”, então na janela que se abre expandir a opção “Configuration Properties”, depois “C/C++” e selecionar “Code Generation”, na caixa “Runtime Library” escolha “Multi-threaded DLL (/MD)”, que é a forma com o a SDL é compilada:
Modificando o tipo de runtime
Agora finalmente o programa compila sem qualquer erro ou aviso. Observe que configurar o diretório de include e o diretório de bibliotecas do Visual C++ é necessário apenas um vez, pois as configurações são do ambiente a podem ser criados quantos projetos forem necessários sem que seja preciso repetir essas operações. Apenas a configuração das bibliotecas que o projeto utiliza é que precisa ser repetido a cada novo projeto (que precise das mesmas), mas este é um passo feito apenas durante a configuração inicial do projeto.

Considerações Finais

Como foi dito, não existe uma regra sobre organização de bilbliotecas e diferentes plataformas adotam diferentes métodos, neste artigos vimos os meios mais comuns e um exemplo de como utilizar uma biblioteca no Visual C++. Apesar do exemplo ser baseado em SDL e no Visual C++ os conceitos são os mesmos para quase todas plataformas, sendo estes:

  • Configurar diretório de arquivos cabeçalho na IDE, makefile, etc
  • Configurar diretório de arquivos de biblioteca na IDE, makefile, etc
  • Informar ao linker quais arquivos de biblioteca usar

Espero assim que este artigo ajude a entender como funciona a utilização de bibliotecas em programas C/C++.


Comentários (33)
  • bruno  - incrivel
    avatar

    Muito boa a qualidade do post claro e simples

  • Bruno Crivelari Sanches
    avatar

    Obrigado Bruno!

  • Dionisio Mauricio
    avatar

    Ola, Bruno..vi o seu post e gostei mt das suas dicas cara, sera que vocepode me ensinar a programar em c#, e que esto com algumas dificuldades com relacao a matéria..

  • Victor  - Bom.
    avatar

    Ajudou muito, os tutoriais são muito bons. Pena que só use para desenvolvimento de jogos no Visual Studio.

  • Bruno Crivelari Sanches
    avatar

    Na verdade boa parte dos conceitos mostrados aqui são os mesmos em outros compiladores e ambientes, apenas as instruções passo a passo que são totalmente especificas ao Visual.

    Sem falar que no desenvolvimento profissional de jogos no Windows o Visual reina absoluto :).

  • Vinícius Godoy de Mendonça
    avatar

    Dê uma olhada nesse tutorial também: Ponto V! - Um ambiente para desenvolver jogos com a SDL e a OpenGL. Ele ensina a configurar um ambiente para o Code::Blocks.

    O conceito de biblioteca apresentado nesse artigo, no C::B, é o mesmo. Muda apenas a forma de configurar. Como o bruno falou, usamos o visual de exemplo pois ele é a IDE mais comum, e mais poderosa também.

  • Ataides Marques  - Biblitecas
    avatar

    estamos precisando de duas bibliotecas ou libs para a linguagem C:

    cstdlib
    iostream


    muito obrigado por vossa atenção


    meu email é tyde_mar@hotmail.com

    abraços

    Ataides

  • Bruno Crivelari Sanches
    avatar

    Se estiver falando dos arquivos cstdlib.h e iostream (que são apenas arquivos de include e não bibliotecas) eles já vem com o seu compilador. Qual compilador você esta usando?

    Detalhe que iostream é apenas para C++ e não funciona com C.

    T+

  • Henrique Lobo Weissmann (Kico)
    avatar

    Maravilhoso este post.

    Um dos pontos mais nebulosos pra mim no uso do C++ era justamente como usar as bibliotecas, e você conseguiu expor como isto é feito de uma forma maravilhosamente clara.

    Parabéns!

  • Bruno Crivelari Sanches
    avatar

    Obrigado Henrique!

    Fico feliz em saber que tem sido facil entender esses conceitos.

  • Henrique Lobo Weissmann (Kico)
    avatar

    Sim, aliás, eu to achando o conteúdo de C++ do Ponto V maravilhoso.

    Absurdamente do caralho.

  • Marcelo ( muito bom )  - bom
    avatar

    eu uso o C++ para criação de programas , assim como o c# , mais para a area de desenvolvimento ... mas achei muito interessante o post. o iostream realmente só se usa na plataforma c++ .

  • Reinaldo Deprera  - Muito bom
    avatar

    Artigo muito bem escrito, bem didático. Além de ser um dos poucos artigos que abordam a questão (a documentação do visual c++ é ruim na minha opinião, não tem uma sequencia didática).
    No meu caso programo para a web apesar de no passado ter trabalhado com clipper e vb/vba. Com c/c++ tive pouca dificuldade com compiladores no linux, mas o quando decidi usar uma IDE no Windows.... o Visual c++ 9... enfim..... este artigo me mostrou o que eu queria.

    Excelente conteúdo, não somente este artigo. Recomendo a todos.

  • Bruno Crivelari Sanches
    avatar

    Obrigado pessoal! Em breve espero adicionar mais artigos de C++!

    T+

  • Rafael Nunes  - Erro de execução
    avatar

    Olá.

    Sou programador formado em C++ .
    não posso dizer que tenho muita experiencia pois tenho apenas 15 anos!
    mas já fiz cursos de treinamento e de linguagem de programação, estou a entrar na carreira de produção de jogos. Peguei a SDL instalei, coloquei em um diretório especifico, configurei tudo corretamente ! Quando executo o programa, ele executa sem erros, compila sem erros ! Quando ele vai executar, da um erro de execução, falando que a SDL.dll não pode ser encontrada, e eu '-' kkk...fui no diretório lib da SDL vi a SDL.dll e falei, esse computador só pode estar louco :X !
    tentei ,tentei e tentei, não consegui executar, mesmo com outro código. Não entendo oque pode ser isso, até porque sou inexperiente em libs hehe :lol: .

    Obrigado.
    Att. Rafael Nunes

  • Vinícius Godoy de Mendonça
    avatar

    Oi.

    Configurar o ambiente é realmente uma das partes mais difíceis. Dê uma lida nesse post:
    http://pontov.com.br/site/opengl/137-criando-um-ambiente-para-jogos-co m-sdlopengl

    Mas basicamente, o que está faltando é criar uma pasta no path, e jogar as dlls lá dentro (isso é explicado bem no começo do post).

  • Rafael Nunes  - Obrigado
    avatar

    ah, sim, tinha esquecido desse recurso xD ! Já fiz isso em C::B com allegro, mas agora vou mudar pra SDL, acho melhor, mais estável.
    Obrigado, aliás já tinha lido esse post ;)' eu leio tudo kkk...

  • Átila
    avatar

    Tive o mesmo problema. Fui em Configurações Avançadas do sistema e editei um path. Devo ter feito errado. Enfim poderia explicar melhor?E teria como recuperar o path anterior, o padrão.

  • Bruno Crivelari Sanches
    avatar

    Explicar melhor o que? Qual parte você não entendeu?

    Recuperar o path anterior? Talvez com restauração do sistema? Tem que ver na documentação do windows.

    T+

  • Átila
    avatar

    Consegui consertar o meu problema, acho. Só uma coisa, o que o programa faz?

  • Bruno Crivelari Sanches
    avatar

    O objetivo do artigo é mostrar o processo de usar uma biblioteca C/C++ em um programa C, esse processo é basicamente o mesmo para qualquer biblioteca e qualquer ambiente (as vezes com alguma peculiaridade do ambiente e/ou biblioteca).

    Por isso o programa não faz nada além de inicializar e finalizar a SDL. Tem outros artigos aqui no portal que mostram mais recursos da SDL.

    T+

  • maria antônia  - analise
    avatar

    :cheer: hum gostei muitoo,ajudou bastante para o meu trabalho de montar um sistema para biblioteca da minha escola

    Citou:
    Código:

  • josefa Maria  - Trabalho de avaliação
    avatar

    bastante proveitoso para o meu sucesso
    obrigado aos colaboradoresss!!!!!!!!!

  • Anônimo
    avatar

    Obrigado!

  • Marcelo Romeu Gonçalves
    avatar

    Valeu aí pelo post Bruno... Foi de excelente qualidade e muito esclarecedor!

  • Anônimo
    avatar

    Obrigado Marcelo!

  • MARCOS R PINNTO  - Erro na execução
    avatar

    O que poderia estar causando esses erros:

    'HelloSDL.exe' (Win32): Loaded 'C:\Users\MRP\Documents\Visual Studio 2012\Projects\HelloSDL\Debug\HelloSDL.exe'. Symbols loaded.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ntdll.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel32.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\KernelBase.dll'. Cannot find or open the PDB file.
    The program '[7840] HelloSDL.exe' has exited with code -1073741515 (0xc0000135) 'A dependent dll was not found'.

  • Anônimo
    avatar

    O principal erro é o final: The program '[7840] HelloSDL.exe' has exited with code -1073741515 (0xc0000135) 'A dependent dll was not found'.

    Tenha certeza que a SDL.dll esteja no path ou em algum lugar que o Windows possa localizar.

    Se você copiar ela para C:\Users\MRP\Documents\Visual Studio 2012\Projects\HelloSDL\Debug\ deve resolver, mas não gosto dessa solução.

  • Marcos R Pinnto
    avatar

    Bom, saiu daquele erro e agora executa até certo ponto. Em seguida mostra

    'HelloSDL.exe' (Win32): Loaded 'C:\Users\MRP\Documents\Visual Studio 2012\Projects\HelloSDL\Debug\HelloSDL.exe'. Symbols loaded.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ntdll.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel32.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\KernelBase.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Users\MRP\Documents\Visual Studio 2012\Projects\HelloSDL\Debug\SDL.dll'. Module was built without symbols.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\advapi32.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcrt.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sechost.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\rpcrt4.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sspicli.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\cryptbase.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\gdi32.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\user32.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\lpk.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\usp10.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winmm.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcr110.dll'. Symbols loaded.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\imm32.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msctf.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\uxtheme.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dwmapi.dll'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\KBDUS.DLL'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Unloaded 'C:\Windows\SysWOW64\KBDUS.DLL'
    'HelloSDL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\KBDBR.DLL'. Cannot find or open the PDB file.
    'HelloSDL.exe' (Win32): Unloaded 'C:\Windows\SysWOW64\KBDBR.DLL'
    The program '[2068] HelloSDL.exe' has exited with code 0 (0x0).

  • Anônimo
    avatar

    Aparentemente seu programa executou e finalizou normalmente.

  • Victor Cortes
    avatar

    Olá! Realmente é muito bom o conteúdo que foi mostrado. Muito claro e proveitoso.

    Eu tenho uma pequena dúvida, se trata de um "joguinho" que eu estou fazendo. Eu estou usando SDL_Image, SDL_ttf e o SDL_Mixer. A minha grande preocupação foi a quantidade enorme de dll's que vou ter que distribuir com minha aplicação (7 dll's!), o que eu não vejo acontecendo em vários jogos que usam a SDL. O que eu devo fazer para resolver este "problema"? Teria como incorporar dll's como se fossem lib estática?

  • vai te foder  - vaite foder
    avatar

    viciado

  • Rick  - Entusiasta
    avatar

    Olá! tudo bom.. sabe, eu não sou programador em nenhuma linguagem.
    Gosto de pegar sources para compilar em c++ e c#
    Peguei recentemente muitos projetos de um jogo mmorpg para compilar..
    o autor ate nos passa as libs (ABI) que ele usa e desse jeito fica mais fácil para compilação.
    Tenho noção de tudo sobre o programa visual studio c++ e c#, mas não sei programar ainda... a parte de programação, algarismos, isso me confunde e me estressa.. acabo desistindo..

    Queria aprender, mas não tenho mais paciência para aprender lendo, então estou tentando aprender na marra usando os códigos ja pronto e compilando-os e olhando os erros e tentando decifrar e pesquisando o que seja e arrumar.

    A pergunto que não quer calar.. como aprender de um modo menos cansativo? voce sabe?

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter