一堆文件做成一个库,虚卖文件内容之间必须没有冲突才行。提供可应用的库,必须提供与库有关的 头文件,头文件里要有 函数原型声明,全局量,宏。
文件内容没有冲突,你可猜誉则以先把文件文本合起来,
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 生成动态链接库
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)