Sei sulla pagina 1di 9

Dichoesto,vamospocoapococonlomsbsico.HazteunprogramitadeHolaMundo.cparair probando.Puedesercomoeste # i n c l u d e < s t d i o . h > m a i n ( ) { p r i n t f ( " H o l a m u n d o \ n " ) } Locompilaremosdelaformahabitual. $ c c H o l a M u n d o . c o H o l a M u n d o Loprobamosyfunciona!.Nadaespectacularhastaahora.Vuelveacompilarloconelmismo comando.Sevuelveacompilarysiguefuncionando. Veamosahoraconmake .Sihaces $ m a k e H o l a M u n d o Puesmake tedirquenohaynadaquehacer.Primeradiferenciaconcompilaramano.Comoel programayaesthecho,make nohacenada.

ho,make nohacenada.Esto,enunprogramademuchaslneasdecdigo quetardavariosminutosencompilar,esunagranventaja. Borraelejecutableyvuelveahacermake $ r m H o l a M u n d o $ m a k e H o l a M u n d o Estavezsisehacompilado.Misteriosamentesehaescritosloelcomandodecompilacinyel programasehacompilado.Tocaahoraelficherofuente(edtalo,ponleuncomentarioenalgnsitio yslvalo,osmplemente,cmbialelafechacontouchHolaMundo.c).Alhacermake ,sevuelvea compilar. Estoquieredecirquemake esmslistodeloquepensabamos.Noslomirasielejecutableyaest hecho,sinoquecomparaademslasfechasdelfuente(elHolaMundo.c)yelejecutable, compilandoonoelprogramaenfuncindeestasfechas. make entiendeademsdeextensionesycompiladores.Fjate,alhacermakeHolaMundo ,el ficheroHolaMundo.csecompilaconelcompiladorcc.Siahoralecambiaslaextensinylo llamasHolaMundo.cpp ,alhacermakesecompilarconelcompiladordec++,elg++.Tambin entiendelasextensionesdefortranydeensamblador.Lasversionesmsmodernas(almenoslas deSolaris,elunixdeSun)inclusosoncapacesdecompilarjava.SiponesmakeHolaMundo.o , tambinsabrgeneraradecuadamenteelficheroobjeto(el.o). Todoestosedebeaquemaketieneunasreglasimplcitasqueleindicancmoobtenerun ejecutable.Estasreglas,almenosenSolaris,estnescritasenunficheromake.rulesqueest perdidoporlosdirectoriosdelsistemaoperativo.Enlinuxdebeandar por/usr/share/lib/make/make.rules,aunquesupongoquedependedeladistribucin.

Variablesdeentorno Conestoyapodemoscompilarcualquierprogramasimple.Vamosahoraacomplicarunpocoms elmake .Creamosdosdirectorios.UnodeelloslollamamosPRINCIPALyelotroFUNCION1. EnPRINCIPALponemosnuestroHolaMundo.c.EnFUNCION1vamosacrearunfichero.hque llamaremostexto.h ysucontenidoeseste: # d e f i n e T E X T O " H o l a M u n d o " NuestroHolaMundo.clocambiaremosunpocoparaquecontengalosiguiente: # i n c l u d e < s t d i o . h > # i n c l u d e < t e x t o . h > m a i n ( ) { p r i n t f ( " % s \ n " , T E X T O ) } AhoranosmetemoseneldirectorioPRINCIPALyhacemos,comoantesmakeHolaMundo .Como esdeesperar,obtenemosunerror.Nosabeencontrarelficherotexto.h,puestoquenoestenlos directoriospordefectodebsquedadeficheros.h. Elcomandomake ,ademsdesaberhacerciertosejecutablesapartirdesusfuentes,tambines capazdemirarciertasvariablesdeentornoparabuscarficherosdecabecera(.h),libreras,etc. Estasvariablesdeentornoestndefinidasenelmake.rulesquemencionamosanteriormente. UnavariablebastanteinteresanteesCFLAGS(CPPFLAGSparaelcompiladordeC++).Esta variablepuedecontenerlasopcionesquequeramosquesepasenalcompilador.Porejemplo,si hacermos $ C F L A G S = g e x p o r t C F L A G S $ m a k e H o l a M u n d o veremoscmoalcompilarelficheroHolaMundoselepasaalcompiladorlaopcing(parapoder meterluegoeldebugger). UnadelasopcionesquesepuedepasaralcompiladoreslaopcinI,quenospermiteponerpaths debusquedaparaficherosdecabecera(.h).Ennuestroejemplo,yusandounpathrelativo, deberamosponeralgoascomoI../FUNCION1.Vamosaello: $ C F L A G S = I . . / F U N C I O N 1 e x p o r t C F L A G S $ m a k e H o l a M u n d o Estavezsdeberairtodocorrectamente. ElficheroMakefile

Vamosacomplicarlelavidaunpocomsalcomandomake .Pongamosahoraenel directorioFUNCION1dosficheros.Unfuncion1.h yunfuncion1.c.Elcontenidodeestosficheros sera: f u n c i o n 1 . h v o i d e s c r i b e H o l a M u n d o ( ) f u n c i o n 1 . c # i n c l u d e < s t d i o . h > v o i d e s c r i b e H o l a M u n d o ( ) { p r i n t f ( " H o l a M u n d o \ n " ) } Elficherotexto.h podemosborrarloporqueyanonosservirms. EncuantoalprogramaeneldirectorioPRINCIPAL,lomodificamosparaquepongaesto: # i n c l u d e < f u n c i o n 1 . h > m a i n ( ) { e s c r i b e H o l a M u n d o ( ) } DesdeeldirectorioPRINCIPALponemosnuestravariableCFLAGScomoantesyhacemoselmake. $ C F L A G S = I . . / F U N C I O N 1 e x p o r t C L F A G S $ m a k e H o l a M u n d o Obtenemosotravezunerror.makecompilaelficheroHolaMundo.c,nocompilael ficherofuncion1.cyobtenemosunerror.Estoyaesdemasiadopararesolverloconvariablesde entorno.Enelmomentoquetenemosdosficheros.cparaconstruirunnicoejecutable, necesitamosdecirleamake culessonlosficherosquedebecompilar. Podemoshacerquemakeseamslistoescribiendounfichero,unodecuyosnombrespordefecto esMakefile ,ydecirleenlqucosasqueremosquehagaycmo.Eneseficheropondremos cosascomo o b j e t i v o : d e p e n d e n c i a 1 d e p e n d e n c i a 2 . . . < t a b > c o m a n d o 1 < t a b > c o m a n d o 2 < t a b > . . . objetivoesloquequeremosconstruir.Puedeserelnombredeunejecutable,elnombredeuna libreraocualquierpalabraquenosinventemos.Paranuestroejemplo,podemosponerque nuestroobjetivoeselnombredenuestroejecutable,esdecirHolaMundo. dependencia<i>eselnombredeotroobjetivoquedebehacerseantesqueelnuestroobien

ficherosdelosquedependenuestroobjetivo.Ennuestroejemplo,lasdependenciasseran nuestrosficherosfuenteHolaMundo.c,../FUNCION1/funcion1.h y../FUNCION1/funcion1.c yaqueparahacerelejecutablenecesitamostodosesosfuentesysilostocamos,posiblemente debamosrehacerelejecutable. <tab>esuntabulador.Esimportantequeahipongamosuntabulador,porquesinoelficherono seleecorrectamente. comando<i>esloquesetienequeejecutarparaconstruirnuestroobjetivo.Seirnejecutando estoscomandosensecuencia.Puedesercualquiercomandodeshellvlido.(cc,rm,cp,ls,o inclusounscriptquenoshayamoshecho).Ennuestroejemplo,seraccHolaMundo.co HolaMundo .Nuestromakefiletendraentonces H o l a M u n d o : H o l a M u n d o . c . . / F U N C I O N 1 / f u n c i o n 1 . c . . / F U N C I O N 1 / f u n c i o n 1 . h c c I . . / F U N C I O N 1 H o l a M u n d o . c . . / F U N C I O N 1 / f u n c i o n 1 . c o H o l a M u n d o Ahora,despusdeborrarelejecutable,sihacemosmake(asecas,sinparmetro),sevolvera compilarnuestroprograma.Siamakenoleponemosparmetro,buscarunficheroMakefiley dentrodelharelprimerobjetivoqueencuentre.Ennuestrocaso,elnicoquehayes HolaMundo. Bueno,unacosaquetengoqueadvertiresqueestaNOeslaformacorrectadehacer unMakefile,perolohacemosasparaquequedemsclaroynointroducirdemasiadosconceptos degolpe.Conloquedebesquedarteesconlasintaxis(objetivo,dependenciasycomando)yel cmofunciona.Elqucosashayqueponerycmoloiremosexplicandopocoapoco. Fjatequeenelcomandodecompilacin,elcc,hemospuestounaopcinI../FUNCION1paraque seacapazdeencontrarlosficheros.h.Siponemosuncomandodecompilacin,yanovalen lasreglasimplcitasqueconocemake.Alponeruncomandodecompilacin,nuestroejecutable segenerarconnuestracomando(reglaexplcita)ynosecogernadadeotrositio(nisiquierala variabledeentornoCFLAGS). MejorandoelMakefile EsteincorrectoMakefilefuncionacorrectamente.Sitocamoscualquierfichero(contoucho editndoloysalvando),serecompilaraelprograma.Porquesincorrectoentonces?.Es incorrectoporquesitocamoscualquierfichero,recompilaabsolutamentetodo.Perdemoslagran ventajademake paraproyetosgrandes,queconsisteenquecompilasloaquellaspartesqueson necesarias.Loideal,porejemplo,esquesitocamosfuncion1.h ,slorecompileHolaMundo.c,que incluyefuncion1.h ,peroquenorecompilefuncion1.c,quenoincluyeparanadaafuncion1.h . (otracosaquequefuncion1.cimplementaunafuncincuyoprototipoestenfuncion1.h ysi tocamosdichoprototipo,debemostocartambinelcdigodefuncion1.c) Paraconseguirestecomportamientoidealnoquedamsremedioquetener"guardados"los ficherosobjeto(los.o)quesegeneran.Enunproyectogrande,estos.osesuelenguardarenforma delibreras.Paranuestroejemplolodejaremosconlos.osueltos. NuestroejecutableHolaMundodependeranicamentedelosdos.ocorrespondientesalos.cque tenemos.EnelMakefile,deberamosponer

H o l a M u n d o : H o l a M u n d o . o . . / F U N C I O N 1 / f u n c i o n 1 . o c c H o l a M u n d o . o . . / F U N C I O N 1 / f u n c i o n 1 . o o H o l a M u n d o ConestoyanonecesitamoslaopcinI../FUNCION1yaquelosficherosfuenteyaestncompilados ynonecesitanlos.hparanada. Aunquemakesabehacerlos.odeunaformapordefecto(buscael.cconelmismonombreylo compilaconlasopcionesadecuadas),siguesinsaberencontrarlos.hqueestnenotros directorios.PodemosponermsreglasennuestroMakefileparaquesepahacercorrectamentelos .o.Laspondremosdetrs,yaquemakehaceelprimerobjetivoqueencuentreenelficheroy queremosqueesteseanuestroejecutable.ElMakefilequedara: H o l a M u n d o : H o l a M u n d o . o . . / F U N C I O N 1 / f u n c i o n 1 . o c c H o l a M u n d o . o . . / F U N C I O N 1 / f u n c i o n 1 . o o H o l a M u n d o . . / F U N C I O N 1 / f u n c i o n 1 . o : . . / F U N C I O N 1 / f u n c i o n 1 . c c c c . . / F U N C I O N 1 / f u n c i o n 1 . c o . . / F U N C I O N 1 / f u n c i o n 1 . o H o l a M u n d o . o : H o l a M u n d o . c . . / F U N C I O N 1 / f u n c i o n 1 . h c c c I . . / F U N C I O N 1 H o l a M u n d o . c o H o l a M u n d o . o Vayapequeogranlio!.Cuandoejecutemosmake,setratardehacernuestroprimer objetivo,HolaMundo.Comoestedependededos.o,seharnprimeroestosdos.Cadaunodeellos dependedelosfuentes(.cy.h)correspondientes.Silosfuentessonmsmodernosqueel.oosino hay.o,secompilar.Siel.oesmsmodernoquelosfuentes,noseharnada.Unavezconstruidos los.o,seconstruirHolaMundoenfuncindequelasfechasdeestos.oseanmsmodernasono queelejecutableHolaMundo.Veamosloporpasosconunejemploconcreto. Supongamosqueyatenamostodocompiladounavez,esdecir,tenemostodoslos.oyelejecutable creados.Editamosysalvamosfuncion1.h yejecutamosmake.Elcomandomsomenosdaralos siguientespasos: HolaMundodependedeHolaMundo.o y../FUNCION1/funcion1.o .Miramosestosdosantes dehacernada. HolaMundo.o dependedeHolaMundo.cy../FUNCION1/funcion1.h .Comohemostocadoel .h,esteesmsmodernoqueHolaMundo.o ,asquesehacelacompilacin. ../FUNCION1/funcion1.o dependede../FUNCION1/funcion.c.Comonohemostocadonada,el .osermsmodernoqueel.cynosecompilanada. ComoHolaMundo.o sehageneradonuevo,esmsmodernoqueelejecutableHolaMundo,as quesecompila. Conestovemosqueslosehacompiladounodelos.c,mientrasqueelotronohahechofalta. Seguimosmejorandocosas.Sirecordamosdeantes,maketieneunasreglasimplcitasquele permitenconstruirelsolitolos.o.Slonecesitasaberdndeencontrarlosficherosdecabecera(.h). Adems,paraun.onicamentehacefaltaun.c,asquedeberabastarconlareglaimplcitayla variabledeentornoCFLAGS.ElMakefilequedara: H o l a M u n d o : H o l a M u n d o . o . . / F U N C I O N 1 / f u n c i o n 1 . o

c c H o l a M u n d o . o . . / F U N C I O N 1 / f u n c i o n 1 . o o H o l a M u n d o . . / F U N C I O N 1 / f u n c i o n 1 . o : . . / F U N C I O N 1 / f u n c i o n 1 . c H o l a M u n d o . o : H o l a M u n d o . c . . / F U N C I O N 1 / f u n c i o n 1 . h yparaquefuncionecorrectamente,antesdehacermake,debemosponerlavariabledeentorno $ C F L A G S = I . . / F U N C I O N 1 e x p o r t C F L A G S $ m a k e EnelMakefileslohemospuestolasdependenciasdelos.oconlosficherosfuente.Estoes necesarioalestarlosfuentesporvariosdirectoriosyhaberficheros.h.Lareglaimplcitaparalos.o nicamentehardependeral.odeun.cconelmismonombreyqueestenelmismodirectorio. VariablesenelMakefile Ysimeolvidodelavariabledeentorno?ocomosuelepasarenunproyectograndeysitengo32 directoriosdeficheros.h?.Afortunadamenteesposibledefinirestasvariables(ycualquierotraque deseemos)dentrodelmismoficheroMakefile.Dehechoyaprovechandoestaposibilidad,vamosa meterenunavariabletambinlos.odeHolaMundo,quesinotenemosqueescribirlosdosveces (unaenlasdependenciasdeHolaMundoyotraenelcomandodecompilacion).ElficheroMakefile, despusdeestoscambios,quedara: O B J E T O S = H o l a M u n d o . o . . / F U N C I O N 1 / f u n c i o n 1 . o C F L A G S = I . . / F U N C I O N 1 H o l a M u n d o : $ ( O B J E T O S ) c c $ ( O B J E T O S ) o H o l a M u n d o . . / F U N C I O N 1 / f u n c i o n 1 . o : . . / F U N C I O N 1 / f u n c i o n 1 . c H o l a M u n d o . o : H o l a M u n d o . c . . / F U N C I O N 1 / f u n c i o n 1 . h Comopuedesver,paraasignarlavariableseponeelnombredelavariable,unigualyloque queramosquetenga.Silalneaesmuylarga,sepuedepartirconlaelcaracter\ O B J E T O S = H o l a M u n d o . o \ . . / F U N C I O N 1 / f u n c i o n 1 . o esos,aseguratequeinmediatamentedetrsdela\estelretornodecarro,quenohayaningn espacioninadaparecidodetrsdela\uobtendrsunmontndeerroresextraos. Parausarelcontenidodelavariable,sepone$yentreparntesiselnombredelavariable. Lautilidadmakedepend

Nosquedaeltemadelasdependenciasdel.oQupasasimis.cincluyen.hqueasuvezincluyen otrosyestosasuvezotros?Tengoquesaberymantenertodaslasdependenciasamano?. Afortunadamentenoesnecesario.Unixnosproporcionamecanismosparahacerlomsfcil. EnSolaris,bastaqueelMakefiletengauna"directiva"queledigaqueseencarguedeello.Nonos hacefaltaponerlasdependenciasniocuparnosdenada.ElMakefile,paraSolaris,quedara # E s t a e s l a d i r e c t i v a q u e l e h a c e m a n t e n e r a u t o m t i c a m e n t e l a s d e p e n d e n c i a s . K E E P . S T A T E : O B J E T O S = H o l a M u n d o . o . . / F U N C I O N 1 / f u n c i o n 1 . o C F L A G S = I . . / F U N C I O N 1 H o l a M u n d o : $ ( O B J E T O S ) c c $ ( O B J E T O S ) o H o l a M u n d o Yaest.Alencontrar.KEEP.STATE,make almacenarenunficheroocultotodaslasdependencias delos.oconlos.hysabrencadamomentosiesnecesarioonorecompilarlos.o.Porcierto, cualquierlneaqueempiececon#,makelaconsideracomouncomentario. Enlinuxestadirectivanodaerror,perotampocohaceloqueseesperadeella.Simplemente, parecequelaignora(sialguiensabealgodeltema,agradezcolainformacinchuidiang@gmail.com) .Enlinux,laopcinqueheencontrado,esgenerarelMakefilesinlosobjetivosdelos.o,esdecir O B J E T O S = H o l a M u n d o . o . . / F U N C I O N 1 / f u n c i o n 1 . o C F L A G S = I . . / F U N C I O N 1 H o l a M u n d o : $ ( O B J E T O S ) c c $ ( O B J E T O S ) o H o l a M u n d o Unavezhechoesto,seejecutauncomandomakedepend,alqueseledebenpasartodoslos.cde nuestroproyectoylasopcionesInecesariasparaqueencuentrelos.h $ m a k e d e p e n d I . . / F U N C I O N 1 H o l a M u n d o . c . . / F U N C I O N 1 / f u n c i o n 1 . c Estecomandomirartodaslasdepenciasdelos.cconlos.hyaadirlaslneasdeobjetivos.o alfinaldelMakefile.Esdecir,estasdoslneas . . / F U N C I O N 1 / f u n c i o n 1 . o : . . / F U N C I O N 1 / f u n c i o n 1 . c H o l a M u n d o . o : H o l a M u n d o . c . . / F U N C I O N 1 / f u n c i o n 1 . h Comopuedesver,algomsincomodoqueel.KEEP.STATEdeSolaris,peromejorqueescribirlo todoamano,especialmentesiunos.hincluyenaotrosqueasuvezincluyenaotros. Bueno,lodemakedepend siguesiendounpocopesado.Cuandolollamemos,debemosponerun montndecosasdetrs,sobretodosinuestroproyectoesmuygrande.Esbastantehabitual, aprovechandovariablesquetenemosenMakefile,ponerunobjetivonuevoquesellamedependy cuyocomandoseamakedepend.Deestaforma,luegoejecutaremosmakedepend ysehar solo.ElMakefilequedara

O B J E T O S = H o l a M u n d o . o . . / F U N C I O N 1 / f u n c i o n 1 . o F U E N T E S = H o l a M u n d o . c . . / F U N C I O N 1 / f u n c i o n 1 . c C F L A G S = I . . / F U N C I O N 1 H o l a M u n d o : $ ( O B J E T O S ) c c $ ( O B J E T O S ) o H o l a M u n d o d e p e n d : m a k e d e p e n d $ ( C F L A G S ) $ ( F U E N T E S ) HemosaadidounavariableFUENTESconlosfuentes.cdenuestroproyectoyhemos reaprovechadolavariableCFLGASparaelmakedepend.Ahora,con $ m a k e d e p e n d segenerarandentrodeMakefiletodaslasdependenciasdelos.o.Bastaconhacerestallamada unasolavezyservirmientrasnocambiemoslosincludedenuestrosfuentesocreemosfuentes nuevos. Enmakefile.tartienesenformatotarlosdosdirectorios(PRINCIPALyFUNCION1),conlosficheros quehaydentrodeellos.Puedesdescargarloenundirectoriodetrabajo,qutaleladichosaextensin .txtydescomprimirlocontarxfmakefile.tar . Unltimoapunte Enunproyectogrande,los.osesuelenguardarenlibrerias.Lohabitualesqueencadadirectorio defuentessehagaunMakefileespecficoparaconstruirunalibreraconlosfuentesdeese directorio.ElMakefileprincipalllamaralosMakefiledecadadirectorio(porqueeseserel comandodecompilacinquenosotrospongamos)yluegoconstruyaelprincipal. Esdecir,siconfuncion1.chacemosunalibreralibfuncion1.aytienesupropioMakefileensu propiodirectorioFUNCION1,elMakefiledePRINCIPALpodraseralgoascomo C F L A G S = I . . / F U N C I O N 1 L D F L A G S = L . . / F U N C I O N 1 H o l a M u n d o : H o l a M u n d o . o . . / F U N C I O N 1 / l i b f u n c i o n 1 . a c c o H o l a M u n d o H o l a M u n d o . o $ ( L D F L A G S ) l f u n c i o n 1 . . / F U N C I O N 1 / l i b f u n c i o n 1 . a : m a k e C . . / F U N C I O N 1 Veamoscondetallealgunascosas LDFLAGSesunavariableigualqueCFLAGS,peroqueledicealasreglasimplcitasquopciones usarparaellinkado.EnestecasolaestamosusandoparalaopcinL,quedicedndehay libreras.NohayningunareglaimplicitaennuestroMakefilequelovayaausar,perohemos llamadoalavariabledelamismamanera.

Parahacerlalibrera,llamamosamakeconlaopcinC.Estaopcinlediceamakequedebe cambiarsealdirectorio../FUNCION1antesdeejecutarse.AllencontrarelMakefile parahacerla librera.EnelMakefiledePRINCIPALnoponemosdependenciasparalalibrera.Estas dependenciasestarnpuestasenelMakefiledeFUNCION1yseresteelquedecidasihayque reconstruironolalibrera. Resumen HazteeldirectoriodondevayatuprogramaprincipalunficherodenombreMakefile.Estefichero debecontener: C F L A G S = I < d i r e c t o r i o 1 > I < d i r e c t o r i o 2 > . . . O B J E T O S = < o b j e t o 1 > < o b j e t o 2 > . . . F U E N T E S = < f u e n t e 1 > < f u e n t e 2 > . . . M i E j e c u t a b l e : $ ( O B J E T O S ) < t a b > c c $ ( O B J E T O S ) o M i E j e c u t a b l e d e p e n d : < t a b > m a k e d e p e n d $ ( C F L G A S ) $ ( F U E N T E S ) <directorio1>,<directorio2>,...sondirectoriosdondetengasficheros.hdetuproyecto.Nohace faltaquepongaslosdelsistema(stdio.hydems),queesosseponensolos. <objeto1>,<objeto2>,...sonlos.odetuproyecto,esdecir,todosycadaunodelos.c,pero cambindoleslaextensinpor.o.Estosobjetosdebenincluirelpathdondeestnlos.c.Por ejemplo,sitengo/users/chuidiang/proyecto/directorio1/fichero.c,unodelosobjetos ser/users/chuidiang/proyecto/directorio1/fichero.o <fuente1>,<fuente2>,...sonlosfuentes,igualquelos<objeto1>,<objeto2>,peroterminadosen.c envezde.oytambinconelpath.<tab>esuntabulador.Esimportantequeestah,sino obtendremoserrores. Cadavezqueentuproyectogeneres.ho.cnuevosocambieslosincludesdelosfuentesya existentes,actualizaelficheroMakefile(FUENTES,OBJETOSyCFLAGS)yejecutaunavez $ m a k e d e p e n d Cuandoquierascompilar,simplementeescribe $ m a k e Porsupuesto,amboscomandoseneldirectoriodondeestelficheroMakefile. Enmakefile.tartienesunejemplocondosdirectorios.Descargalo,qutaleladichosaextensin.txt, descomprmelocontarxfmakefile.tar,vetealdirectorioPRINCIPALyhazmakedepend y luegomake.Puedesjugarconelloparavercmofuncionaomodificarloparatuspropiosproyectos.

Potrebbero piacerti anche