Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

509
Visualizações
C: Creating static library and linking using a Makefile

I am trying to understand static and shared Libraries.

I want to do the following to create a makefile that does separate compilation and linking such that a static library is created and linked in forming the final static executable.

I have the following code for the Makefile, but I am getting the following error

Makefile:13: *** missing separator. Stop.

But I am also trying to understand how to actually link/create libraries.

If I run the commands after line 12 in the terminal they work, but not in the makefile.

myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o

main.o: main.c
    gcc -O -c -lm main.c main.h

addSorted.o: addSorted.c addSorted.h
    gcc -O -c -lm addSorted.c

freeLinks.o: freeLinks.c freeLinks.h
    gcc -O -c -lm freeLinks.c

ar rc libmylib.a main.o addSorted.o freeLinks.o    //Error Line

ranlib libmylib.a

gcc -o foo -L. -lmylib foo.o

clean:
    rm -f myProgram main.o addSorted.o freeLinks.o

Also, if you can assist in improving the code, I would really appreciate it.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Try this:

all: myProgram

myProgram: main.o libmylib.a #libmylib.a is the dependency for the executable
        gcc -lm -o myProgram main.o -L. -lmylib

main.o: main.c
        gcc -O -c main.c main.h

addSorted.o: addSorted.c addSorted.h
        gcc -O -c addSorted.c

freeLinks.o: freeLinks.c freeLinks.h
        gcc -O -c freeLinks.c

libmylib.a: addSorted.o freeLinks.o #let's link library files into a static library
        ar rcs libmylib.a addSorted.o freeLinks.o

libs: libmylib.a

clean:
        rm -f myProgram *.o *.a *.gch #This way is cleaner than your clean

This set of rules first compiles all files, then it makes library (libmylib.a) target and uses it's artifact to link the executable. I also added separate redundant target form making libs only. Needed files:

user@host> ls
addSorted.c  addSorted.h  freeLinks.c  freeLinks.h  main.c  main.h Makefile
over 4 years ago · Santiago Trujillo Relatório

0

A makefile is not a shell script. It's a configuration file for an expert system. Specifically an expert system that knows, if you tell it, how to efficiently create files and their dependencies with a minimum of re-making files that don't need to be remade.

If you look at the first rule you have:

myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o

that tells the system how to make a file called "myProgram" if it decides that it needs to do that. The parts after the colon are files that myProgram needs. If they aren't there, or make decides they are out of date, make will try to find some recipe that can be used to create or update them. Once all that is done, make then executes the "gcc ..." line and assumes that will create or update myProgram.

The ar and ranlib lines you have don't match the needed syntax for a makefile rule. From the look of them, they appear to be a recipe for making libmylib.a. If you put them into the syntax make needs to say that, you get:

libmylib.a: main.o addSorted.o freeLinks.o
    ar rcu libmylib.a main.o addSorted.o freeLinks.o
    ranlib libmylib.a

myProgram should depend on the library itself, rather than the contents of the library, and it is best to put the library options at the end:

myProgram: libmylib.a
    gcc -o myProgram libmylib.a -lm

if you like, you can use an option to tell gcc to look for libraries in the current directory:

gcc -L. -o myProgram main.o -lmylib -lm

There are also makefile variables that can help you not have to repeat so much, so I would write the first rule as:

myProgram: libmylib.a
    gcc -L. -o $@ -lmylib -lm

however, it is unlikely that main.o should actually be part of the library, so:

myProgram: main.o libmylib.a
    gcc -L. -o $@ $< -lmylib -lm

and the library rule as:

libmylib.a: addSorted.o freeLinks.o
    ar rcu $@ $+
    ranlib $@

the $+ here means "all of the dependency file names".

Finally, if you want gcc to make an actual static executable, and not just use the library you made, you need to pass the '-static' option to gcc.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda