当前位置:首页 » 编程软件 » 怎么把源码编译成函数库

怎么把源码编译成函数库

发布时间: 2022-06-15 22:51:48

① 程序怎么实现成库函数

自己去学学命名空间(几乎所有语言都有),编的程序要抠门,别指望编译器帮你优化,同时要学会使用内联代码,宏展开少用,容易产生副作用,因为你不是标准库,大家不知道你用的是不宏,如果使用c++的标准库,记得别忘了都是用std::。
比如max函数:
template<typename
Ty>
inline
const
Ty&
max(const
Ty
&a,const
Ty
&b)
{
return
a>b?a:b;
}
又例如一个输出数据的函数:
template<typename
Iter>
void
out(Iter
beg,Iter
end)
{
for(char
sp('
');beg!=end;++beg)
//注意是++beg而不是beg++,这个效率有问题
(std::cout<<*beg).put(sp);
std::cout<<std::endl;
/*一定要加std::别有一天有人不喜欢using
namespace
std;你就欲哭无泪了*/
}

② 如何将这个源代码改成函数

int
__cdecl
scanf
(
const
char
*format,
...
)
{
va_list
arglist;
va_start(arglist,
format);
return
vscanf(_input_l,
format,
null,
arglist);
}
int
__cdecl
vscanf
(
inputfn
inputfn,
const
char
*format,
_locale_t
plocinfo,
va_list
arglist
)
/*
*
stdin
'scan',
'f'ormatted
*/
{
int
retval;
_validate_return(
(format
!=
null),
einval,
eof);
_lock_str2(0,
stdin);
__try
{
retval
=
(inputfn(stdin,
format,
plocinfo,
arglist));
}
__finally
{
_unlock_str2(0,
stdin);
}
return(retval);
}
int
__cdecl
_input_l(_inout_
file
*
_file,
_in_z_
__format_string
const
unsigned
char
*,
_in_opt_
_locale_t
_locale,
va_list
_arglist);
由上面代码可知scanf
只不过是一张皮,scanf
一个族系的函数都是通过实际调用
vscanf
来实现功能的,而vscanf
又是通过调用
_input_l
函数来实现功能的。
我们知道windows
的io
是通过文件技术实现的,不管是输入设备还是输出设备,操作系统都将它抽象成一个文件,通过对文件的读写实现对数据的输入和输出。
通过查询stdin的定义:
#define
stdin
(&__iob_func()[0])
_crtimp
file
*
__cdecl
__iob_func(void);
我们可以知道,_input_l
函数正是将键盘输入写入了stdin
创建一个临时的交换文件的缓冲区的。
说道读取文件,你上面的问题就好揭示了。
第一、"1000
50
^z"
是一个整体,是一个有效的字符串,其本身并不含有文件结尾的含义。因为你不能说“这个人不讲礼貌,分手了也不说再见”,这句话和“再见”
这个词的含义是一样的。
第二、单独的^z
可被认作文件的结尾也就是你判断条件中的eof。
因此,单独输入^z
是可以结束循环的。

c语言如何生成库文件

有一些代码,我们编程时经常用到,或者我们对某些部分很熟悉,并写出了一些可用的接口。这时,我们会考虑把这些c文件做成一个lib库,以方便自己使用,或这给别人调用。
我这里介绍下在vc++6.0下如何来制作静态库:
第一步:创建一个工程,选择Win32Static
Library,输入工程名。这时就创建好了。
第二步:工程创建好了,再点击新建,这时选择文件,选择c++
source
file选项,创建一个.c
文件。
在这个文件中,你可以写入你要做成库的c函数。当然,可以继续创建其他c文件,然后将要供外部使用的接口单独放到头文件中,一般而言,一个c文件对应一个头文件。
第三步:完成以上步骤后,我们就可以生成库了。事实上,我们点击编译即可,这时就可以生成.lib文件了。
一般情况下,是可以正常生成lib文件的。有头文件和lib文件就可以给别人用了。然后我们可以写一个测试函数来试试可不可以使用。
要调用生成的lib中的函数,就要引入头函数。这时,你把lib和头文件放入当前工程中,但build的时候却显示了连接错误。那是因为你没有把lib文件包含进来。加入下面这句话即可了:
#pragma
comment(lib,
"mylib.lib
")
Ok,自己的lib库就这样做成了。以后可以随便调用了

④ 如何编译C语言源代码

下载一个VC2005软件,把代码复制到里面,设置好C运行环境,点击编译,OK,然后点击那个感叹号,直接链接运行,就OK了。

源码怎么编译

使用编译器如VC++6.0,VC++2008

⑥ 我用c语言写了两个函数,怎么把它变成c的库函数随时调用求解释!

改成。h 放到库文件里

调用函数时 包含这个。h文件即可

⑦ 怎么源码编译依赖LAPACK和ATLAS库的NumPy包

1. GCC版本要求
使用较新版本的GCC工具集(尽量不低于v4.7)且集成有gfortran编译器。
备注1:这里大写的"GCC"是指GNU Compiler Collection,它除包含C语言编译器gcc外,还包含很多其它语言的编译器(如g++/gfortran等)
备注2:3.x版的的C语言编译器gcc会由于某些头文件缺失导致编译atlas库报错
备注3:若GCC工具集中没有gfortran编译器,则编译lapack库时会遇到一些莫名其妙的错误(因为lapack是用fortran编写的),好在GCC4.7及以上版本中已经集成了gfortran编译器
在GCC版本符合要求的前提下,临时将其加入环境变量PATH并设置动态库查找路径:
[plain] view plain
在CODE上查看代码片派生到我的代码片
$ export PATH=/home/slvher/tools/gcc48/bin/:$PATH
$ export LD_LIBRARY_PATH=/home/slvher/tools/gcc48/lib64:/home/slvher/tools/gcc48/lib
备注4:在当前shell会话中临时设置LD_LIBRARY_PATH可以保证编译过程中正确搜索到GCC库,但最好不要设置到.bash_profile中,因为那样会影响其它程序的查找路径,可能会踩到坑。
备注5:这里提到的GCC的版本要求及环境变量设置如果没有出差错,那么下面的编译会比较顺利,否则会遇到各种编译/链接问题,后续我会用一篇笔记来记录这些踩坑的过程及遇到这些诡异问题时的分析思路,这里不赘述。
2. 编译LAPACK和ATLAS库
lapack是用fortran开发的经过特别优化的线性代数计算库;atlas也是一个优化过的线性代数计算库,它提供了BLAS库的全部API(包括C接口和Fortran接口),还实现了lapack库中的部分函数,atlas在编译过程中会根据机器的配置参数来调整科学计算函数的参数,以便在该机器上达到更好的计算性能。
初看起来,需要分别编译lapack和atlas两个库,所幸的是,atlas库支持编译时自动编译lapack库,因此,只需正确完成atlas库的编译配置,编译atlas库就可以了。
下面是编译atlas/lapack库的主要步骤。
1) 分别从官网下载lapack源码包和atlas源码包,我下载的是目前的最新版lapack-3.5.0.tgz及atlas3.10.2.tar.bz2
2) 解压atlas源码压缩包:tar -jxvf atlas3.10.2.tar.bz2
3) cd ATLAS && mkdir BLDdir && cd BLDdir
4) 执行configure命令以配置编译参数
[plain] view plain
在CODE上查看代码片派生到我的代码片
$ ../configure --shared -b 64 --prefix=/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs --with-netlib-lapack-tarfile=/home/slvher/tools/scikit-learn-virtualenv/dep-libs/lapack-3.5.0.tgz
其中,--shared表明要编译atlas共享库(configure会自动在编译命令中插入"-fPIC"参数,无需在这里显式指定);--prefix指定编译结果的安装路径;--with-netlib-lapack-tarfile表明编译atlas库时会用相同的编译器及编译/链接参数自动编译lapack库,这里指定lapack源码包的路径后,configure运行后会自动解压lapack源码并将其拷贝至BLDdir/src/lapack/reference/这个目录下。
5) configure运行完后,BLDdir目录下生成了Make.inc文件,该文件中设置了众多编译参数(如查找路径、编译产出路径、编译器、传给编译器的参数,等等),BLDdir子目录下很多模块的Makefile都会include这个Make.inc,包括源码独立的lapack包,可见,这个Make.inc文件可以达到统一编译环境的目的。
6) make build
7) make check
8) make ptcheck
9) make install
如果上述一系列命令均执行成功,那么编译完成的*.a和*.so库会安装到--prefix参数指定的路径下,这些库的头文件也会被拷贝到安装路径下的include目录。
至此,ATLAS和LAPACK库均完成编译,其中LAPACK库是.a静态库,ATLAS库是.so动态库。事实上,ATLAS的动态库中已经包含了LAPACK静态库的所有符号和代码。
下面可以开始编译依赖LAPACK和ATLAS库的NumPy包了。
3. 编译优化版NumPy包
前提:官网下载NumPy源码包并解压,这里以目前最新版numpy-1.9.2.tar.gz为例进行说明。
1) cd至解压目录numpy-1.9.2
2) cp site.cfg.example site.cfg
3) 在site.cfg中配置atlas项,其中include_dirs和library_dirs是atlas库安装路径下的include和lib目录
[plain] view plain
在CODE上查看代码片派生到我的代码片
[atlas]
atlas_libs = lapack,f77blas,cblas,atlas
library_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib
include_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include
4) python setup.py config
5) python setup.py build --fcompiler=gnu95 ## 指定Fortran编译器为GCC4.8工具集中的gfortran
6) python setup.py install
正常情况下,build成功后,install会把编译产出拷贝到当前python解释器安装路径下的lib/python2.7/site-packages目录中。
此时,可以通过下面的例子来查看NumPy包的配置情况:
[python] view plain
在CODE上查看代码片派生到我的代码片

>>>importnumpyasnp
>>>np.__config__.show()
atlas_3_10_blas_threads_info:
libraries=['lapack','f77blas','cblas','atlas']
library_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
define_macros=[('HAVE_CBLAS',None),('ATLAS_INFO','"\"3.10.2\""')]
language=c
include_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
lapack_opt_info:
libraries=['tatlas','lapack','f77blas','cblas','atlas']
library_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
define_macros=[('ATLAS_INFO','"\"3.10.2\""')]
language=f77
include_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
blas_opt_info:
libraries=['lapack','f77blas','cblas','atlas']
library_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
define_macros=[('HAVE_CBLAS',None),('ATLAS_INFO','"\"3.10.2\""')]
language=c
include_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
openblas_info:
NOTAVAILABLE
openblas_lapack_info:
NOTAVAILABLE
atlas_3_10_threads_info:
libraries=['tatlas','lapack','f77blas','cblas','atlas']
library_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
define_macros=[('ATLAS_INFO','"\"3.10.2\""')]
language=f77
include_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
lapack_mkl_info:
NOTAVAILABLE
blas_mkl_info:
NOTAVAILABLE
mkl_info:
NOTAVAILABLE
也可以用具体的例子来验证其功能是否正常:
[python]viewplain
在CODE上查看代码片派生到我的代码片
>>>importnumpyasnp
>>>np.arange(15).reshape(3,5)
array([[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14]])
>>>
>>>a=np.arange(15).reshape(3,5)
>>>a
array([[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14]])
>>>type(a)
<type'numpy.ndarray'>
>>>
>>>
>>>fromnumpy.linalgimport*
>>>b=np.array([[1.0,2.0],[3.0,4.0]])
>>>b
array([[1.,2.],
[3.,4.]])
>>>b.transpose()
array([[1.,3.],
[2.,4.]])
>>>inv(b)
array([[-2.,1.],
[1.5,-0.5]])
>>>

⑧ C语言里如何编译库函数最好举例,详细点的!

太长了发2部分给你ok学习任何知识,循序渐进总是最好的方式。不幸的是,很多人明知这个道理,却总是想走所谓的捷径。如果你是一个刚刚开始学习编程的中学生,或者你是一个刚刚进入计算机学院的本科生,又或者你是一个决心在计算机领域有所建树的初学者,你一定迫切地想知道,学习计算机技术,究竟应该从哪里下手。 我的建议是:数学、英语、C语言。 为什么C语言如此重要?我们从学习方法开始说起。书本上描述的东西,倘若不经过我们的亲自实践,是难以被彻底消化吸收的。计算机组成原理讲解了浮点数的格式,如果我们能看到并分析内存或寄存器中某个浮点数的表示,那比单纯的纸上谈兵要强一千倍;数据结构与算法似乎很难,如果你能把书上的例子实现出来,然后把习题做完,只需啃完一本好书,你也可以是算法高手;操作系统原理其实不仅仅是原理,只有做一些内核方面的实验才能真正有深刻理解;还有许多新潮的技术,比如JavaEE、PHP、Ajax、.NET等等等等,很多高手学习这些技术只需要很短的时间,不必说,他们肯定是C语言的高手。C语言几乎是一切计算机技术的通用工具,包括计算机的各种基本理论。没有精通C语言的决心,就不要涉足计算机领域。 为什么是C语言而不是C++不是Java不是其它?因为C语言最简单。你需要掌握一个语言工具,但也许并不需要“面向对象”、“模板”、“函数重载”等等一大堆概念。C语言足够低级,非常非常地贴近计算机的底层结构,不会让你迷失在概念的汪洋大海。除了“指针”,C语言没有真正意义上的难点,而“指针”,恰恰是理解计算机底层结构精髓的关键所在 所以,初学者们不必思考应该学什么,等把C语言精通了,你自己便会知道下一步如何去走。如果你对操作系统内部感兴趣,你便可以试着研究一下Unix的内核,除了C语言,你还需要一些汇编语言和保护模式的知识;如果你对算法感兴趣,那么恭喜你,C语言足够使用了;如果你对Windows编程感兴趣,去看看《Windows程序设计》吧,作者清楚的告诉你“只需要C语言的基础”;如果你对任何其它语言感兴趣,尽管去学吧,不过还是建议先学C++,因为你需要一些“面向对象”的知识。 一、要读就读好书,否则不如不读 大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐这本书作为C语言课本。虽然本人的名字(谭浩宇)跟教授仅仅一字之差,但我是无比坚定地黑他这本书的。这本书不是写给计算机专业的学生的,而是给那些需要考计算机等级考试的其它专业学生看的。这本书的主要缺点是:例子程序非常不专业,不能教给你程序设计应该掌握的思考方式;程序风格相当地不好,会让你养成乱写代码的恶习;错误太多,曾经有人指出过这本书的上百个错误,其中不乏关键的概念性错误。好了,这本书我也不想说太多了,有兴趣大家可以网络一下。 Kernighan和Ritchie的《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。另外,即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C语言,有那么一些C语言的基础但又不是很扎实,那么你可以尝试一下这本书。我相信,只要你理解了指针,C语言便不再神秘。 如果你已经啃完了一本C语言教材,想要更进一步,那么有两本书你一定要看。首先是《C Traps and Pitfalls》(中译名《C陷井与缺陷》),很薄的一本小册子,内容非常非常地有趣。要注意一点,这本书是二十多年前写成的,里面提到的很多C语言的缺陷都已被改进,不过能够了解一些历史也不是什么坏事。

⑨ C语言中如何将自己常用的函数封装到编译器的库函数中具体应该怎么做呢

用编译器提供的库管理工具。
C语言的编译器都会提供一个命令行工具,可以把自己编译后的.obj模块加入指定的库文件,以后使用时只需要连接该库文件即可。这个命令行工具通常是lib.exe,用这个工具可以查看库中的模块,可以把模块加入到库中,可以从库中删除模块。这个工具不仅仅是自己建立的库文件的管理工具,可以管理所有的库文件,包括C语言提供的标准库。

热点内容
定义dns服务器的ip 发布:2025-05-17 20:32:37 浏览:954
android判断图片 发布:2025-05-17 20:32:33 浏览:833
安卓12什么时候适配小米 发布:2025-05-17 20:31:47 浏览:71
c语言字符串初始化 发布:2025-05-17 20:18:43 浏览:37
安卓融e联推送需要什么权限 发布:2025-05-17 20:18:39 浏览:269
我的世界无限武魂服务器 发布:2025-05-17 20:17:09 浏览:372
安卓手游脚本语言 发布:2025-05-17 19:53:07 浏览:22
找圈算法 发布:2025-05-17 19:49:19 浏览:411
数据库的存取方法 发布:2025-05-17 19:48:36 浏览:126
androidapp测试 发布:2025-05-17 19:48:19 浏览:389