① Cmake命令之find_library介绍
该命令用于查找库(动态库或者静态库),当构建依赖于第三方库/系统库,可以使用该命令来查找并使用库(Cmake中有另外一个命令 find_package ,能获取库的更多信息,具体可以参考 Cmake命令之find_package介绍 )
通过一个例子来看下基本的使用,假设我们目录和文件树如下,:
我们在 mylib 中生成最终的库 libmymath.a ,然后在顶层的 CMakeLists.txt 中查找这个库文件,几个文件的具体内容如下:
在 ./mylib/ 下执行 cmake . 和 make 以便生成库 libmymath.a ,然后在 ./ 目录下执行 cmake . 和 make ,得到可执行文件 test ,运行 test 的结果为:
库的搜索路径分为两大类: 默认搜索路径 和 附加搜索路径 。
默认搜索 路径包含 cmake 定义的以 CMAKE 开头的一些变量(例如 CMAKE_LIBRARY_ARCHITECTURE 、 CMAKE_PREFIX_PATH 、 CMAKE_LIBRARY_PATH 、 CMAKE_FRAMEWORK_PATH )、标准的系统环境变量(例如系统环境变量 LIB 和 PATH 定义的路径)、系统的默认的库安装路径(例如 /usr 、 /usr/lib 等);
附加搜索路径 即 find_library 命令中通过 HINTS 或 PATHS 指定的路径;
1) 通过命令行使用 -D 指定的 CMAKE_XXX_PATH 变量,也就是形如 cmake . -DCMAKE_XXX_PATH=paths 的格式。其中 CMAKE_XXX_PATH 包含如下几个:
CMAKE_PREFIX_PATH :指定搜索目录的前缀,如果前缀有多个,需要以 分号分割的列表 方式提供,该变量默认为空,一旦该变量非空,那么会搜索该变量提供的目录,以及 ${CMAKE_PREFIX_PATH}/lib ;例如 CMAKE_PREFIX_PATH=A;B ,那么 find_library 会从 A 、 B 以及 A/lib 、 B/lib 中搜索库是否存在;
CMAKE_LIBRARY_ARCHITECTURE :如果该变量被设置,那么会搜索目录 ${CMAKE_PREFIX_PATH}/lib/${CMAKE_LIBRARY_ARCHITECTURE} ;
CMAKE_LIBRARY_PATH :指定 find_library 的库查找目录,默认值为空,多个值时需要以分号分割列表指定;
CMAKE_FRAMEWORK_PATH *:指定 macOS 的框架作为搜索路径。
2) 通过在 环境变量 中指定 CMAKE_XXX_PATH 变量,例如在 window 的环境变量中增加 CMAKE_XXX_PATH (以 ; 分割多个路径)、 Linux 中 shell 配置文件中添加(以 : 分割多个路径)。用法和 cmake -D 指定类似,例如在我的机器中( macOS ),在 .zshrc (我的命令行配置文件)中增加 export CMAKE_LIBRARY_PATH="/XXX/……/mylib" ,即可在将该目录加入到搜索路径中。
3) HINTS 选项指定的路径。
4) 系统环境变量指定的目录,默认是 LIB 和 PATH 指定的路径。例如在 PATH 中指定库搜索目录;
也可以通过 find_library 中的 PATHS ENV 环境变量名称 ( cmake 中使用环境变量名称的格式为 $ENV{环境变量名称} )来指定从哪个环境变量名称中获取路径,例如定义一个 TESTPATH 环境变量并赋值为 ./mylib ,并在 find_library 命令中指定使用该环境变量:
5)跟当前系统相关的平台文件路径,一般来说指的是当前系统安装软件的标准目录,不同的操作系统对应的路径有所不同。 camke 中 find_library 与此相关的也有如下几个, CMAKE_SYSTEM_XXX_PATH 变量,这些:
CMAKE_SYSTEM_PREFIX_PATH :指定安装目录的前缀,例如在 Windows 下的 /XXXX/Program Files , Linux 下的 /usr 或 /usr/local 等。 find_library 命令会搜索这些前缀目录,也会以这些目录加上 lib 进行搜索,例如搜索 /usr/local/lib ;
CMAKE_SYSTEM_LIBRARY_PATH :默认是当前系统的标准目录,不建议修改它;例如在我的系统,这个变量的值是 /usr/lib/X11 ;
CMAKE_SYSTEM_FRAMEWORK_PATH : macOS 框架路径,默认是当前系统的标准目录,不建议修改它;例如在我的系统,这个变量的值包含了路径 /Library/Frameworks ;
6) PATHS 选项指定的路径。
② 在TC中,怎样用命令编译lib库
定义函数库的方法及应用:
一、2个相关的命令
1、TCC——TC的DOS下的命令行编译连接工具
2、TLIB——TC的DOS下的库操作工具
二、1个自定义的函数库的例子
1、
在TC集成环境下,编一个文件USERADD.C
#define
_NO_MAIN
int
add(int
*a,int
*b)
{
int
c;
c=(*a)+(*b);
return
c;
}
按ALT—F9编译
生成一个
USERADD.OBJ文件。
2、按F10—F—O
退到DOSSHELL(DOS环境下)
COPY
USERADD.OBJ
到
..\LIB目录,在\LIB目录下执行
TLIB
USERLIB.LIB+USERADD.OBJ
就生成了一个自己的函数库
USERLIB,在这个函数库里就包含了函数模块
int
add(int
*a,int
*b)
的二进制代码。现在已经将自定义的函数放进了函数库,就可以把原文件USERADD.C删掉不要了。(当然,为了以后维护方便,还是作一个备份为好)。
以后如有其它的函数模块,也可以编译后用TLIB
命令加入到这个函数库里。
3、写一个包含文件
USER1.H,写完后COPY到INCLUDE
目录。内容如下:
int
add(int
*,int
*);
4、作好了以上的自定义函数库的准备工作,现在就可以使用了。
写一个程序,取名为ADD-1.C,在程序中调用库函数add(
);
#include
#include
void
main(
)
{
int
a,b,c;
a=20;b=30;
c=add(&a,&b);
printf(“%d”,c);
}
5、在DOS命令行下,执行
TCC
ADD-1.C
..\LIB\USERLIB.LIB
就OK!
运行ADD-1.EXE,可以看到输出结果
50
Tc生成lib的方法:
扩展库与自建LIB库使用扩展库TC所带的库在有的情况下是无法满足功能要求的,自己写一个太麻烦,找到了一个LIB库又怕不会用。在WIN-TC中,对于使用外部的扩展库(第三方LIB)提供了一个方便的解决方法:首先要确定你的LIB库是FOR
TC版本的而不是FOR
VC或是其它的。如果确定是FOR
TC的版本的话就把你的首标文件(或称头文件),就是扩展名为*.h的文件拷贝到WIN-TC的include目录里,然后把相应名称的*.lib文件拷贝到lib目录,然后再运行WIN-TC时选择“编译配置”菜单项,你会看到扩展库信息栏目里有你的LIB库文件名在上面了,但是没有打钩。然后你把它钩选后再“确定”保存,以后的编译程序时就自动链接该扩展库了。自建立LIB库将自己的代码编译成LIB库的格式有利与保护自己的代码版权。如何来生成自己的LIB库呢?请按照下面的方法:
STEP
1——生成目标代码(OBJ)
建立mylib的代码文件/*********************
mylib.c
*********************/void
myfun(){printf("
myfun()
in
mylib.lib
");}然后保存为WIN-TC目录下的mylib.c文件然后到菜单项:运行->编译设置
看看“产生
OBJ
文件”是否已选择,若未选择则选择之。然后回到主界面,点“编译链接”按钮(F9
查看原帖>>