<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://glaudiston.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fglaudiston.spaces.live.com%2fcategory%2fComputers%2band%2bInternet%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Site pessoal de Glaudiston: Computers and Internet</title><description /><link>http://glaudiston.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catComputers%2band%2bInternet</link><language>en-US</language><pubDate>Sat, 16 Aug 2008 09:27:31 GMT</pubDate><lastBuildDate>Sat, 16 Aug 2008 09:27:31 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://glaudiston.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>5810493780584479084</live:id><live:alias>glaudiston</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>autotools parte2 - adicionando dependencias</title><link>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!303.entry</link><description>Bem, no artigo anterior, já expliquei como funciona o autotools:&lt;br&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns!50A3054EE15AB96C!298.entry"&gt;http://glaudiston.spaces.live.com/blog/cns!50A3054EE15AB96C!298.entry&lt;/a&gt;&lt;br&gt;&lt;br&gt;Agora vou explicar como adicionar dependências.&lt;br&gt;&lt;br&gt;Neste exemplo, vou puxar pro lado de desenvolvimento de games, usando SDL que é uma biblioteca portável, que tem funções de controle de hardware entre outras coisas que facilitam muito nossa vida, e outras bibliotecas derivadas do SDL, como o SDL_image para controle de imagens de vários formatos, o SDL_mixer para o controle de mid, wav, ogg e mp3, o SDL_gfx, para rotação e zoom de imagens ou filmes, o SDL_mpeg para reprodução de filmes... etc.&lt;br&gt;&lt;br&gt;Vamos começar com a teoria:&lt;br&gt;Pelo que já vimos, você deve ter percebido que o autotools trabalha com macros, macros são funções prontas, programas que você passa um comando com parâmetros ou não e eles executam determinadas funções.&lt;br&gt;Você também já deve ter percebido que estas configurações são centralizadas nos arquivos configure.ac e Makefile.am. Sim... continua assim, porém vamos colocar mais um arquivo importante: o acinclude.m4 .&lt;br&gt;&lt;br&gt;acinclude.m4:&lt;br&gt;    Este arquivo é uma forma de adicionar macros que podem ser usadas dentro do configure.ac, por exemplo: o Sam Lantinga, desenvolvedor do SDL, criou um arquivo chamado sdl.m4 que está no código fonte do SDL, você pode baixar este código na página do SDL em &lt;a href="http://www.libsdl.org"&gt;http://www.libsdl.org&lt;/a&gt;, e copiar este arquivo sdl.m4 para o nosso diretório base. depois disto é só adicionar sdl.m4 em nosso arquivo acinclude.m4.in ou acinclude.m4, adicionar o teste desta biblioteca no arquivo configure.ac e executar o autogen.sh&lt;br&gt;Depois de copiar o sdl.m4, só é necessário adionar uma linha com o conteudo sdl.m4 no acinclude.m4.in ... NÃO é preciso nada como #include sdl.m4 ... apenas o sdl.m4... depois disto o script de teste no configure.ac, deve ser colocado na parte de libraries é assim:&lt;br&gt;&lt;pre&gt;dnl Check for SDL &lt;br&gt;SDL_VERSION=1.2.0&lt;br&gt;AM_PATH_SDL($SDL_VERSION, &lt;br&gt;         :,&lt;br&gt;         AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!]) &lt;br&gt;) &lt;br&gt;CXXFLAGS=&amp;quot;$CXXFLAGS $SDL_CFLAGS&amp;quot; &lt;br&gt;LIBS=&amp;quot;$LIBS $SDL_LIBS&amp;quot;&lt;/pre&gt;Para mais informações, consulte o artigo: &lt;a href="http://www.samhart.com/snh/files/docs/sdl-kdev/sdl-kdev-mini-how2-2.html"&gt;http://www.samhart.com/snh/files/docs/sdl-kdev/sdl-kdev-mini-how2-2.html&lt;/a&gt;&lt;br&gt; &lt;br&gt;Agora se tudo está certo, você pode executar nosso script de reconfiguração (vide artigo anteiror citado acima):&lt;br&gt;$ sh autogen.sh&lt;br&gt;&lt;br&gt;O resultado esperado é:&lt;br&gt; sh autogen.sh &lt;br&gt;checking for a BSD-compatible install... /usr/bin/install -c&lt;br&gt;checking whether build environment is sane... yes&lt;br&gt;checking for a thread-safe mkdir -p... /bin/mkdir -p&lt;br&gt;checking for gawk... gawk&lt;br&gt;checking whether make sets $(MAKE)... yes&lt;br&gt;checking for gcc... gcc&lt;br&gt;checking for C compiler default output file name... a.out&lt;br&gt;checking whether the C compiler works... yes&lt;br&gt;checking whether we are cross compiling... no&lt;br&gt;checking for suffix of executables... &lt;br&gt;checking for suffix of object files... o&lt;br&gt;checking whether we are using the GNU C compiler... yes&lt;br&gt;checking whether gcc accepts -g... yes&lt;br&gt;checking for gcc option to accept ISO C89... none needed&lt;br&gt;checking for style of include used by make... GNU&lt;br&gt;checking dependency style of gcc... gcc3&lt;br&gt;checking for sdl-config... /usr/bin/sdl-config&lt;br&gt;checking for SDL - version &amp;gt;= 1.2.0... yes&lt;br&gt;configure: creating ./config.status&lt;br&gt;config.status: creating Makefile&lt;br&gt;config.status: creating src/Makefile&lt;br&gt;config.status: creating config.h&lt;br&gt;config.status: config.h is unchanged&lt;br&gt;config.status: executing depfiles commands&lt;br&gt;&lt;br&gt;Observe que agora temos uma parte onde o SDL está sendo checado por uma versão superior à 1.2.0&lt;br&gt;&lt;br&gt;Isto é suficiente pro SDL, mas e quando temos outras dependências que não nos dão as macros m4 prontas ?&lt;br&gt;A primeira coisa é procurar no google... muitas vezes, no código fonte não vem o arquivo m4, mas alguém criou e postou em algum lugar. Então, se você encontrar vai simplificar muito seu configure.ac da forma q fizemos acima. Mas se o google não achar ? como fazer ?&lt;br&gt;&lt;br&gt;Neste caso, você pode criar seu arquivo m4, ou pode simplesmente adicionar o uma verificação no configure.ac, só q vai poluir um pouco nosso arquivo configure.ac que até então está bem simples.&lt;br&gt;&lt;br&gt;Depois vou postar mais entrada a respeito disto: autotools, criando seu próprio m4.&lt;br&gt;&lt;br&gt;Por hora é só. Tenho que fazer algum código também &lt;img src="http://shared.live.com/HjKMzTS-xzcms40!CabizA/emoticons/smile_tongue.gif" title="Tongue out" alt="Tongue out" style="vertical-align:middle"&gt;&lt;br&gt;&lt;br&gt;Abs,&lt;br&gt;Ton&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5810493780584479084&amp;page=RSS%3a+autotools+parte2+-+adicionando+dependencias&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=glaudiston.spaces.live.com&amp;amp;GT1=glaudiston"&gt;</description><comments>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!303.entry#comment</comments><guid isPermaLink="true">http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!303.entry</guid><pubDate>Mon, 10 Dec 2007 16:44:52 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://glaudiston.spaces.live.com/blog/cns!50A3054EE15AB96C!303/comments/feed.rss</wfw:commentRss><wfw:comment>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!303.entry#comment</wfw:comment><dcterms:modified>2007-12-10T16:44:52Z</dcterms:modified></item><item><title>ifconfig não funciona??? net-tools!!!</title><link>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!302.entry</link><description>Hahaaa!!!&lt;br&gt;&lt;br&gt;Usando o LinuxFromScratch, e tentando executar alguns programas que configuram VPN, tive vários problemas, e testando, descobri que o problema é que o ifconfig que eu estava usando era o do netutils, e não o do net-tools... segue alguns:&lt;br&gt;'ifconfig: can not resolve`down`: No address associated with name&amp;quot;&lt;br&gt;&amp;quot;ifconfig: cannot resolve `up': No address associated with name&amp;quot;&lt;br&gt;&amp;quot;ifconfig eth0 up&amp;quot;&lt;br&gt;&amp;quot;ifconfig: can not resolve `up': Unknown host&amp;quot;&lt;br&gt;# ifconfig -a&lt;br&gt;ifconfig: option requires an argument -- a&lt;br&gt;Usage: ifconfig [OPTION]... [SYSTEM OPTION]...&lt;br&gt;Try `ifconfig --help' for more information.': No address associated with name&amp;quot;&lt;br&gt;&amp;quot;ifconfig: can not resolve `up': No address associated with name&amp;quot;&lt;br&gt;&amp;quot;ifconfig eth0 up&amp;quot;&lt;br&gt;&amp;quot;ifconfig: can not resolve `up': Unknown host&amp;quot;&lt;br&gt;# ifconfig -a&lt;br&gt;ifconfig: option requires an argument -- a&lt;br&gt;Usage: ifconfig [OPTION]... [SYSTEM OPTION]...&lt;br&gt;&lt;br&gt;E o incrível, é q o google não acha nenhum resultado com a maioria destas pesquisas.&lt;br&gt;&lt;br&gt;O LFS Book bem q me avisou pra não instalar o ifconfig do netutils... mas não disse q tinha ifconfig no net-tools tbm... então eu q fiquei quebrando a cabeça e consegui resolver com a ajuda do Guedes... valeu mais esta Bill!&lt;br&gt;&lt;br&gt;resumindo, é só instalar o net-tools:&lt;br&gt;http://www.linuxfromscratch.org/blfs/view/stable/basicnet/net-tools.html&lt;br&gt;&lt;br&gt;Abs&lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5810493780584479084&amp;page=RSS%3a+ifconfig+n%c3%a3o+funciona%3f%3f%3f+net-tools!!!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=glaudiston.spaces.live.com&amp;amp;GT1=glaudiston"&gt;</description><comments>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!302.entry#comment</comments><guid isPermaLink="true">http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!302.entry</guid><pubDate>Fri, 07 Dec 2007 17:06:31 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://glaudiston.spaces.live.com/blog/cns!50A3054EE15AB96C!302/comments/feed.rss</wfw:commentRss><wfw:comment>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!302.entry#comment</wfw:comment><dcterms:modified>2007-12-09T22:17:01Z</dcterms:modified></item><item><title>Autotools, ah se todos usassem !!!</title><link>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!298.entry</link><description>autotools é um conjunto de ferramentas que simplifica a verificação de dependências e compilação de programas.&lt;br&gt;&lt;br&gt;É tão usado no mundo opensource que é até um padrão usado e recomendado pelo gnu.&lt;br&gt;tudo se torna simples quando se tem um projeto usando autotools... &lt;br&gt;Você apenas descompacta os fontes com:&lt;br&gt;tar xvf nomedoarquivo.tar.bz2&lt;br&gt;depois usa:&lt;br&gt;./configure&lt;br&gt;make&lt;br&gt;make install&lt;br&gt;&lt;br&gt;Se o código depender de outro componente que não exista em seu ambiente, ele vai ser detectado no ./configure ... sendo assim fica fácil descobrir o que está faltando e instalar esta dependência antes de executar o make que é a parte demorada do processo.&lt;br&gt;&lt;br&gt;O make é a compilação do programa... isto costuma demorar... e muitas vezes tem que executar centenas de subcompilações com linhas de comandos que incluem várias bibliotecas e que seria inviável para um usuário digitá-las na mão, um script para esta compilação poderia ser mantido pelo desenvolvedor do programa, mas daria muito trabalho a ele. É aqui que entra o autotools, ele cria este script automaticamente com um esforço mínimo do desenvolvedor.&lt;br&gt;Mas infelismente muitos projetos não o usam.&lt;br&gt;&lt;br&gt;Vou mostrar em um exemplo prático como é fácil e prático usá-lo.&lt;br&gt; &lt;br&gt;Vamos criar um novo diretório com o nome autotools-example:&lt;br&gt;$ mkdir autotools-example&lt;br&gt;$ cd autotools-example&lt;br&gt;&lt;br&gt;teremos um subdiretório src onde ficaram os fontes:&lt;br&gt;$ mkdir src&lt;br&gt;&lt;br&gt;e agora vamos criar um arquivo representando o nosso código:&lt;br&gt;cat &amp;gt; src/main.c &amp;lt;&amp;lt; &amp;quot;EOF&amp;quot;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;&lt;br&gt;int main(int argc, char** argv)&lt;br&gt;{&lt;br&gt;        printf(&amp;quot;funciona!!!\n&amp;quot;); &lt;br&gt;        return 0;&lt;br&gt;}&lt;br&gt;&lt;br&gt;EOF&lt;br&gt;&lt;br&gt;pronto... já temos um código do programa, hora de usar o autotools pra compilar.&lt;br&gt;O autotools precisa de um arquivo de referência onde ele vai pesquisar para saber o nome do programa que está sendo compilado e qual é a versão atual, onde estão os arquivos fontes, além de validações obrigatórias ou opcionais, como por exemplo um programa que pode ou não ter suporte a som, dependendo de um parâmetro que o usuário passa para o ./configure... também é no configure.ac que o desenvolvedor personaliza mensagens para o usuário e adiciona verificações adicionais para certificar que o código será compilado.&lt;br&gt;&lt;br&gt;parece complicado né ? mas na prática é simples... olhe:&lt;br&gt;Primeiro use o autoscan que varre todos os arquivos do diretório e subdiretórios para detectar os arquivos fontes e criar o configure.ac que é um dos arquivos essenciais do autotools que o programador deve editar.&lt;br&gt;$ autoscan&lt;br&gt;agora devem ter sido criados 2 arquivos: autoscan.log e configure.scan.&lt;br&gt;&lt;br&gt;o arquivo configure.scan é o configure.ac que nós precisamos para o autotools, e que foi criado automaticamente pelo comando autoscan e o autoscan.log registra algum erro ou mensagens ocorridas durante o processo do autoscan.&lt;br&gt;renomeie o arquivo configure.scan para configure.ac :&lt;br&gt;$ mv configure.scan configure.ac&lt;br&gt;&lt;br&gt;vamos olhar o conteúdo do configure.ac e analisar o que precisaremos atualizar:&lt;br&gt;$ more configure.ac&lt;br&gt;#                                                -*- Autoconf -*-&lt;br&gt;# Process this file with autoconf to produce a configure script&lt;br&gt;&lt;br&gt;AC_PREREQ(2.61)&lt;br&gt;AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)&lt;br&gt;AC_CONFIG_SRCDIR([src/main.c])&lt;br&gt;AC_CONFIG_HEADER([config.h])&lt;br&gt;&lt;br&gt;# Checks for programs.&lt;br&gt;AC_PROG_CC&lt;br&gt;&lt;br&gt;# Checks for libraries.&lt;br&gt;&lt;br&gt;# Checks for header files.&lt;br&gt;&lt;br&gt;# Checks for typedefs, structures, and compiler characteristics.&lt;br&gt;&lt;br&gt;# Checks for library functions.&lt;br&gt;&lt;br&gt;AC_OUTPUT&lt;br&gt;&lt;br&gt;bom... vamos ver...&lt;br&gt;todas as linhas começando com #(sharp, cerquilha, ou jogo da velha, como preverir) são comentários, e ignorados pelo autotools, então a primeira linha de código é:&lt;br&gt;AC_PREREQ(2.61)&lt;br&gt;está dizendo que no ambiente onde será compilado, deve existir instalado o autotools versão 2.61 ou superior.&lt;br&gt;&lt;br&gt;Logo após vem:&lt;br&gt;AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)&lt;br&gt;aqui temos o lugar onde dizemos ao autotools qual é o nosso programa, a versão do nosso programa, e o endereço de email para onde os usuários devem mandar emails em caso de erros. atualize isto como preferir como no exemplo abaixo:&lt;br&gt;AC_INIT(autotools-example, 1.0, [seuemail at dominio dot com] )&lt;br&gt;&lt;br&gt;depois temos:&lt;br&gt;AC_CONFIG_SRCDIR([src/main.c])&lt;br&gt;aqui ele detectou corretamente o nosso diretório de códigos fontes.&lt;br&gt;&lt;br&gt;AC_CONFIG_HEADER([config.h])&lt;br&gt;este arquivo config.h deve pelo comando autoheader e server para definir variáveis de compilação para o autotools, como o PACKAGE_NAME, opções ativas por padrão... etc...&lt;br&gt;$ autoheader&lt;br&gt;&lt;br&gt;agora vamos criar nosso script configure...&lt;br&gt;$ autoconf&lt;br&gt;&lt;br&gt;pronto... se tudo deu certo, agora você terá um arquivo configure em seu diretório, execute-o:&lt;br&gt;$ ./configure&lt;br&gt;&lt;br&gt;ele vai verificar tudo pela primeira vez e criar o config.h...&lt;br&gt;&lt;br&gt;mas ainda precisamos cuidar do automake que irá compilar o nosso projeto.&lt;br&gt;para isto precisamos adicionar um AM_INIT_AUTOMAKE( nomedoprograma, versao ) no configure.ac, então adicione isto logo abaixo de AC_CONFIG_HEADER.&lt;br&gt;AM_INIT_AUTOMAKE(exemplo, 1.0)&lt;br&gt;&lt;br&gt;além disto também é necessário informar quais Makefiles precisam ser criados... então no finao do arquivo configure.ac altere a linha AC_OUTPUT para:&lt;br&gt;AC_OUTPUT([&lt;br&gt;        Makefile&lt;br&gt;        src/Makefile&lt;br&gt;])&lt;br&gt;&lt;br&gt;pronto, agora execute um autoreconf para atualizar os arquivos:&lt;br&gt;$ autoreconf&lt;br&gt;vamos atualizar o automake agora com o parâmetro --add-missing, para que ele crie os arquivos faltantes:&lt;br&gt;$ automake --add-missing&lt;br&gt;&lt;br&gt;agora um ultimo passo é criar o Makefile.am que é bem simples:&lt;br&gt;cat &amp;gt; Makefile.am &amp;lt;&amp;lt; &amp;quot;EOF&amp;quot;&lt;br&gt;SUBDIRS = src&lt;br&gt;&lt;br&gt;EXTRA_DIST = NOTES autogen.sh&lt;br&gt;&lt;br&gt;EOF&lt;br&gt;&lt;br&gt;e um Makefile.ac no diretório de fontes, onde informaremos quem deve ser compilado:&lt;br&gt;cat &amp;gt; src/Makefile.am &amp;lt;&amp;lt;&amp;quot;EOF&amp;quot;&lt;br&gt;bin_PROGRAMS = exemplo&lt;br&gt;exemplo_SOURCES = main.c&lt;br&gt;&lt;br&gt;EOF&lt;br&gt;&lt;br&gt;vamos criar um script pra reconfigurar os arquivos, já fizemos isto, mas precisaremos fazer varias vezes durante o desenvolvimento, um script vai ajudar muito:&lt;br&gt;&lt;br&gt;cat &amp;gt; autogen.sh &amp;lt;&amp;lt;&amp;quot;EOF&amp;quot;&lt;br&gt;#!/bin/sh&lt;br&gt;#&lt;br&gt;aclocal&lt;br&gt;automake --add-missing --foreign&lt;br&gt;autoconf&lt;br&gt;&lt;br&gt;./configure $*&lt;br&gt;EOF&lt;br&gt;&lt;br&gt;agora execute ele:&lt;br&gt;$ sh autogen.sh&lt;br&gt;&lt;br&gt;bem... se vc executar o automake:&lt;br&gt;$ automake&lt;br&gt;vai receber várias mensagens de erros dizendo q ele não encontrou arquivos necessários... alguns podem ser criados automaticamentes com o parâmetro --add-missing... então vamos criá-los:&lt;br&gt;$ automake --add-missing&lt;br&gt;$ touch NEWS README AUTHORS ChangeLog&lt;br&gt;&lt;br&gt;lembre-se de transformar os links simbólicos possivelmente criados pelo automake --add-missing em arquivos reais antes de compartilhar seu projeto, vc pode fazer isto copiando os arquivos dos links e substituindo-os.&lt;br&gt;&lt;br&gt;Neste ponto já deve estar tudo pronto, e você já pode executar:&lt;br&gt;./configure&lt;br&gt;make&lt;br&gt;&lt;br&gt;e já deve ter um arquivo executavel com o nome exemplo na pasta src... então execute:&lt;br&gt;$ src/exemplo&lt;br&gt;funciona!!!&lt;br&gt;&lt;br&gt;se apareceu funciona!!! parabéns, vc acaba de criar seu primeiro projeto com autotools... &lt;br&gt;&lt;br&gt;depois vou mostrar como gerenciar dependências, como o SDL e outros...&lt;br&gt;&lt;br&gt;Qualquer dúvida usem os comentários.&lt;br&gt;Abs...&lt;br&gt;Ton&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5810493780584479084&amp;page=RSS%3a+Autotools%2c+ah+se+todos+usassem+!!!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=glaudiston.spaces.live.com&amp;amp;GT1=glaudiston"&gt;</description><comments>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!298.entry#comment</comments><guid isPermaLink="true">http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!298.entry</guid><pubDate>Fri, 23 Nov 2007 01:34:54 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://glaudiston.spaces.live.com/blog/cns!50A3054EE15AB96C!298/comments/feed.rss</wfw:commentRss><wfw:comment>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!298.entry#comment</wfw:comment><dcterms:modified>2007-11-23T01:34:54Z</dcterms:modified></item><item><title>ANSI C - Portabilidade - WINMAIN LPSTR lpCmdLine to char **argv</title><link>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!246.entry</link><description>Sempre tento criar minhas rotinas portáveis... mesmo que elas sejam apenas para aprendizado.&lt;br&gt;&lt;br&gt;Recentemente testei o SDL_mixer que traz uma rotina exemplo bem legal de como funciona, roda todos os formatos suportados, wav, ogg, mp3... etc. Segue o link:&lt;br&gt;&lt;a href="http://jcatki.no-ip.org/SDL_mixer/demos/"&gt;http://jcatki.no-ip.org/SDL_mixer/demos/&lt;/a&gt;&lt;br&gt;Mas enfrentei alguns problemas de compilação por causa dos argumentos passados pela linha de comando, com certeza a rotina foi desenvolvida em linux... aprecio isto... mas não acho interessante para um software ser restrito pelo sistema operacional, mesmo que este seja aberto.&lt;br&gt;&lt;br&gt;Pesquisei coisas como &lt;font face="Courier New"&gt;LPSTR to char**&lt;/font&gt; e &lt;font face="Courier New"&gt;LPWSTR* to char*&lt;/font&gt; mas sem sucesso.&lt;br&gt;&lt;br&gt;É, a microsoft sempre nos dá um trabalho extra totalmente desnecessário, mas vamos lá... &lt;br&gt;&lt;br&gt;Como vocês já sabem (ou deveriam saber), o windows possui uma forma diferente de iniciar o programa.&lt;br&gt;ao invés do famoso, fácil e perfeito:&lt;br&gt;&lt;font style="background-color:rgb(216, 216, 216)" color="#000000" face="Courier New"&gt;int main(int argc, char **argv)&lt;/font&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;ele usa&lt;br&gt;&lt;font style="background-color:rgb(216, 216, 216)" color="#000000" face="Courier New"&gt;INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, &lt;br&gt;            LPSTR lpCmdLine, INT nShowCmd)&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;/font&gt;&lt;br&gt;Assim sendo, você não tem o array para pegar is itens da linha de comando da forma que está acostumado.&lt;br&gt;Então tive que criar uma forma de resolver isto para que eu possa criar meu código sem me preocupar com OS em que está sendo compilado.&lt;br&gt;&lt;br&gt;Segue:&lt;br&gt;&lt;font color="#000000" face="Courier New"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;#ifndef WIN32&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;int main(int argc, char **argv)&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;{&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;#else&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;#include &amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, &lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;            LPSTR lpCmdLine, INT nShowCmd)&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;{&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;    int argc;&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;    char **argv;&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;    LPWSTR *szArglist;&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;    szArglist = CommandLineToArgvW(GetCommandLineW(), &amp;amp;argc);&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;    int __i;&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;    if( NULL == szArglist ) {&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;        wprintf(L&amp;quot;CommandLineToArgvW failed\n&amp;quot;);&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;        return 0;&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;    } else {&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;        argv = malloc(sizeof(char *) * argc);&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;        for( __i=0; __i&amp;lt;argc; __i++) {&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;            int tmp = wcslen(szArglist[__i]);&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;            char *c = malloc(sizeof(char) * tmp);&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;            wcstombs(c, szArglist[__i], tmp);&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;            argv[__i] = c;&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;      &lt;/span&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;  }&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;    }&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;    // Free memory allocated for CommandLineToArgvW arguments.&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;    LocalFree(szArglist);&lt;/span&gt;&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;span style="background-color:rgb(216, 216, 216)"&gt;#endif&lt;br&gt;    &lt;br&gt;    // O código vem aqui...&lt;br&gt;    // e vc pode acessar o argv normalmente:&lt;br&gt;       int i;&lt;br&gt;       for( i=0; i&amp;lt;argc; i++)&lt;br&gt;           printf(&amp;quot;%d: %s\n&amp;quot;, i, argv[i]);&lt;br&gt;#ifdef WIN32&lt;br&gt;    // Free memory allocated for CommandLineToArgvW arguments.&lt;br&gt;    for ( __i = 0; __i &amp;lt; argc; __i++ )&lt;br&gt;        free(argv[__i]);&lt;br&gt;    free(argv);&lt;br&gt;#endif&lt;br&gt;    return(0);&lt;br&gt;}&lt;br style="background-color:rgb(216, 216, 216)"&gt;&lt;/span&gt;&lt;/font&gt;&lt;br&gt;Me avise se isto for util pra você, ficarei feliz em saber.&lt;br&gt;&lt;br&gt;Até a próxima,&lt;br&gt;Abs,&lt;br&gt;Ton&lt;br&gt; &lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5810493780584479084&amp;page=RSS%3a+ANSI+C+-+Portabilidade+-+WINMAIN+LPSTR+lpCmdLine+to+char+**argv&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=glaudiston.spaces.live.com&amp;amp;GT1=glaudiston"&gt;</description><comments>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!246.entry#comment</comments><guid isPermaLink="true">http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!246.entry</guid><pubDate>Mon, 20 Aug 2007 19:43:40 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://glaudiston.spaces.live.com/blog/cns!50A3054EE15AB96C!246/comments/feed.rss</wfw:commentRss><wfw:comment>http://glaudiston.spaces.live.com/Blog/cns!50A3054EE15AB96C!246.entry#comment</wfw:comment><dcterms:modified>2007-12-10T17:02:29Z</dcterms:modified></item></channel></rss>