I have a question: How to compile a static library in Linux with gcc, i.e. I need to compile my source code into a file named out.a. Is it sufficient to simply compile with the command gcc -o out.a out.c? I'm not quite familiar with gcc, hope anyone can give me a hand.
-
check thisAccountant م– Accountant م2019-03-14 06:29:12 +00:00Commented Mar 14, 2019 at 6:29
3 Answers
See Creating a shared and static library with the gnu compiler [gcc]
gcc -c -o out.o out.c
-c means to create an intermediary object file, rather than an executable.
ar rcs libout.a out.o
This creates the static library. r means to insert with replacement, c means to create a new archive, and s means to write an index. As always, see the man page for more info.
3 Comments
-o isn't required. The output will be the same (out.o)ar rcs libout.a out.o creates ar archive (file libout.a prints libout.a: current ar archive). Is there a command which prints libout.a: static library (or similar)?libc.a) produces "current ar archive" as well.Here a full makefile example:
makefile
TARGET = prog
$(TARGET): main.o lib.a
gcc $^ -o $@
main.o: main.c
gcc -c $< -o $@
lib.a: lib1.o lib2.o
ar rcs $@ $^
lib1.o: lib1.c lib1.h
gcc -c -o $@ $<
lib2.o: lib2.c lib2.h
gcc -c -o $@ $<
clean:
rm -f *.o *.a $(TARGET)
explaining the makefile:
target: prerequisites- the rule head$@- means the target$^- means all prerequisites$<- means just the first prerequisitear- a Linux tool to create, modify, and extract from archives see the man pages for further information. The options in this case mean:r- replace files existing inside the archivec- create an archive if not already presents- create an object-file index into the archive
To conclude: The static library under Linux is nothing more than an archive of object files.
main.c using the lib
#include <stdio.h>
#include "lib.h"
int main ( void )
{
fun1(10);
fun2(10);
return 0;
}
lib.h the libs main header
#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED
#include "lib1.h"
#include "lib2.h"
#endif
lib1.c first lib source
#include "lib1.h"
#include <stdio.h>
void fun1 ( int x )
{
printf("%i\n",x);
}
lib1.h the corresponding header
#ifndef LIB1_H_INCLUDED
#define LIB1_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun1 ( int x );
#ifdef __cplusplus
}
#endif
#endif /* LIB1_H_INCLUDED */
lib2.c second lib source
#include "lib2.h"
#include <stdio.h>
void fun2 ( int x )
{
printf("%i\n",2*x);
}
lib2.h the corresponding header
#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun2 ( int x );
#ifdef __cplusplus
}
#endif
#endif /* LIB2_H_INCLUDED */
3 Comments
ar needs explanation, as it is the key to creating the static library.ar program creates, modifies, and extracts from archives, which are a single files holding a collection of other files in a structure that makes it possible to retrieve the original individual files. ar creates an index to the symbols defined in relocatable object modules in the archive when you specify the modifier s. (see man ar)c++ compiler: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif