如何把一堆 C 文件 做成一个 lib 库

如何把一堆 C 文件 做成一个 lib 库,第1张

MS VC++ 的 Visual Studio 里 建工程项目 中 有 引导提示,一步一步走 就可以建 控制台 静态 lib 库 或 其它 lib 库。

一堆文件做成一个库,虚卖文件内容之间必须没有冲突才行。提供可应用的库,必须提供与库有关的 头文件,头文件里要有 函数原型声明,全局量,宏。

文件内容没有冲突,你可猜誉则以先把文件文本合起来,

copy f1.c + f2.c + ... +fn.c f1ton.c

然后把 所有函数原型声明,结构定义,等 用文本编辑,把它们集中起来,合并, 存入一个自定义 库头文件。

然后把合起来的程序 只编译 成 .obj 成果 .obj 就是库。你可以换名叫 f1ton.lib

库头文件, f1ton.lib 就可以 作为 成品 供他人 使穗棚用。

有二个文件,一个 test.h, 一个 test.c

// test.h

#pragma once

#ifdef __cplusplus

extern "C" {

#endif

int add(int a, int b)

#ifdef __cplusplus

}

#endif // test.c

#include "test.h"

int add(int a, int b)

{

    return a + b

}

编译,生成动态链接库:

# gcc -g3 -Wall -fPIC -shared -o libtest.so test.c

# ls -l

-rwxr-xr-x 1 root root 14618 Jul 24 13:44 libtest.so

-rw-r--r-- 1 root root    63 Jul 24 13:43 test.c

-rw-r--r-- 1 root root   106 Jul 24 13:43 test.h

# nm libtest.so 

00000000002006e8 a _DYNAMIC

0000000000200890 羡没a _GLOBAL_OFFSET_TABLE_

                 w _ITM_deregisterTMCloneTable

                 w _ITM_registerTMCloneTable

                 w _Jv_RegisterClasses

00000000002006c8 d __CTOR_END__

00000000002006c0 d __CTOR_LIST__

00000000002006d8 d __DTOR_END__

00000000002006d0 d __DTOR_LIST__

00000000000006b8 r __FRAME_END__

00000000002006e0 d __JCR_END__

00000000002006e0 d __JCR_LIST__

00000000002008b8 d __TMC_END__

00000000002008b8 A __bss_start

                配派碰 w __cxa_finalize@@GLIBC_2.2.5

0000000000000620 t __do_global_ctors_aux

0000000000000550 t __do_global_dtors_aux

00000000002008b0 d __dso_handle

                 w __gmon_start__

00000000002008b8 A _edata

00000000002008c8 A _end

0000000000000658 T _fini

0000000000000468 T _init

0000000000000600 T add

00000000000004a0 培谈t call_gmon_start

00000000002008b8 b completed.6557

00000000000004c0 t deregister_tm_clones

00000000002008c0 b dtor_idx.6559

00000000000005d0 t frame_dummy

0000000000000500 t register_tm_clones

请搜索“nmake makefile cl.exe lib”之类的关键字。

比如

-------------------------------

CL.exe

CL.exe是册肢册控制Microsoft C和C++编译器与链接器的32位工具。编译器产生通用对象文件格式(COFF)对象(.obj)文件。链接器产生可执行文件饥晌(.exe)或动态链接库文件(DLL)。注意,所有编译器选项都区分大小写。若要编译但不链接,请使用/c。使用NMAKE生成输出文件。使用BSCMAKE支持类浏览。以下是一个完整的编译州宏器选项分类列表。

优化

选项 作用

/O1 创建小代码

/O2 创建快速代码

/Oa 假设没有别名

/Ob 控制内联展开

/Od 禁用优化

/Og 使用全局优化

/Oi 生成内部函数

/Op 改善浮点数一致性

/Os 代码大小优先

/Ot 代码速度优先

/Ow 假定在函数调用中使用别名

/Ox 使用最大优化 (/Ob1gity /Gs)

/Oy 省略框架指针

代码生成

选项 作用

/clr 启用C++的托管扩展并产生在公共语言运行库上运行的输出文件

/EH 指定异常处理模型

/G3 优化代码以优选386处理器。在Visual C++ 5.0 中已经停用,编译器将忽略此选项

/G4 优化代码以优选486处理器。在 Visual C++ 5.0中已经停用,编译器将忽略此选项

/G5 优化代码以优选Pentium

/GB 与/G6等效;将_M_IX86的值设置为600

/Gd 使用__cdecl调用约定

/Ge 激活堆栈探测

/GF 启用字符串池

/GH 调用挂钩函数 _penter

/GL 启用全程序优化

/Gm 启用最小重新生成

/Gr 启用运行时类型信息 (RTTI)

/Gr 使用__fastcall调用约定

/GS 控制堆栈探测

/GT 支持使用静态线程本地存储区分配的数据的纤程安全

/GX 启用同步异常处理

/Gy 启用函数级链接

/GZ 使用__stdcall调用约定

/MD 使用MSVCRT.lib创建多线程DLL

/MDd 使用MSVCRTD.lib 创建调试多线程DLL

/ML 使用LIBC.lib 创建单线程可执行文件

/MLd 使用LIBCD.lib 创建调试单线程可执行文件

/MT 使用LIBCMT.lib创建多线程可执行文件

/MTd 使用LIBCMTD.lib创建调试多线程可执行文件

输出文件

选项 作用

/FA 创建列表文件设置列表文件名

/Fd 重命名程序数据库文件

/Fe 重命名可执行文件

/Fm 创建映射文件

/Fo 创建对象文件

/Fp 指定预编译头文件名

/FR 生成浏览器文件

/Fx 将插入的代码与源文件合并

……

链接

选项 作用

/F 设置堆栈大小

/LD创建动态链接库

/LDd 创建调试动态链接库

/link 将指定的选项传递给LINK

/MD使用MSVCRT.lib编译以创建多线程DLL

/MDd 使用MSVCRTD.lib编译以创建调试多线程DLL

/ML使用LIBC.lib编译以创建单线程可执行文件

/MLd 使用LIBCD.lib编译以创建调试单线程可执行文件

/MT使用LIBCMT.lib编译以创建多线程可执行文件

/MTd 使用 LIBCMTD.lib 编译以创建调试多线程可执行文件

……

……

……

更多的我就不贴出来了。。。msdn中对nmake作了详细说明的。

下面一个nmake的makefile例子:

#命令

CC=cl.exe

DEL=del /Q /S

#头文件与库文件目录

INCLUDES=

LIBS=

#编译链接选项与宏定义

MT=MD ---------------(1)

DEFS=-DWIN32

MOD=---------------(2)

#输出文件

OUTPUT=test.exe

OBJS=main.obj

#内部变量

CFLAGS=/$(MT) $(INCLUDES) $(DEFS) /nologo

LINK=link $(MOD) /OUT:"$(OUTPUT)"

#依赖关系

all:$(OBJS)

$(LINK) $(OBJS)

main.obj:

$(CC) $(CFLAGS) main.cpp -Fo%|fF.obj

clean:

del /Q /S $(OBJS) $(OUTPUT)*

(1):

MD 使用MSVCRT.lib创建多线程DLL

MDd使用MSVCRTD.lib 创建调试多线程 DLL

ML 使用LIBC.lib创建单线程可执行文件

MLd使用LIBCD.lib创建调试单线程可执行文件

MT 使用LIBCMT.lib创建多线程可执行文件

MTd使用LIBCMTD.lib创建调试多线程可执行文件

(2):

为空 生成可执行文件

/LIB 生成静态链接库

/DLL 生成动态链接库


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8162786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存