我有一个问题:如何在Linux中使用编译静态库gcc
,即我需要将源代码编译成名为out.a的文件。仅使用命令编译就足够了gcc -o out.a out.c
吗?我不太熟悉gcc
,希望任何人都可以帮助我。
检查此
—
会计师م
我有一个问题:如何在Linux中使用编译静态库gcc
,即我需要将源代码编译成名为out.a的文件。仅使用命令编译就足够了gcc -o out.a out.c
吗?我不太熟悉gcc
,希望任何人都可以帮助我。
Answers:
gcc -c -o out.o out.c
-c
表示创建中间目标文件,而不是可执行文件。
ar rcs libout.a out.o
这将创建静态库。 r
表示要插入替换,c
表示要创建新的归档文件,以及s
写索引。与往常一样,请参见手册页以获取更多信息。
这里是完整的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)
解释makefile:
target: prerequisites
-规则头$@
-表示目标$^
-表示所有先决条件$<
-只是第一个前提条件ar
-用于创建,修改和从档案中提取文件的Linux工具,请参见手册页以获取更多信息。在这种情况下,这些选项表示:
r
-替换档案中现有的文件c
-如果尚不存在则创建档案s
-在归档文件中创建目标文件索引总结一下:Linux下的静态库只不过是目标文件的存档。
使用lib的main.c
#include <stdio.h>
#include "lib.h"
int main ( void )
{
fun1(10);
fun2(10);
return 0;
}
lib.h libs主头文件
#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED
#include "lib1.h"
#include "lib2.h"
#endif
lib1.c 第一个lib源
#include "lib1.h"
#include <stdio.h>
void fun1 ( int x )
{
printf("%i\n",x);
}
lib1.h 对应的头
#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 第二个lib源
#include "lib2.h"
#include <stdio.h>
void fun2 ( int x )
{
printf("%i\n",2*x);
}
lib2.h 对应的头
#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun2 ( int x );
#ifdef __cplusplus
}
#endif
#endif /* LIB2_H_INCLUDED */
ar
需要进行解释,因为这是创建静态库的关键。
ar
程序从档案中创建,修改和提取档案,这些档案是一个单一文件,在一个结构中包含其他文件的集合,从而可以检索原始的单个文件。ar
当指定修饰符s时,将创建一个指向在归档中可重定位目标模块中定义的符号的索引。(请参阅man ar
)
c++
编译器: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
用gcc生成目标文件,然后将ar
其捆绑到静态库中。