-
理论:
C++中,只有带有main函数的文件才可生成可执行程序,其他的代码,我们把它打包,供其他程序调用,这就是库。
如:opencv库、Eigen库。
注:库里(t3工程中)是没有main.c这样的文件的,因为它是作为库被其他人调用的。 -
Linux中,库文件分为静态库与共享库(动态库)。
静态库以.a后缀结尾,共享库以.so后缀结尾。静态库每被调用一次生成一个副本,共享库只有一个副本。 -
只要有了头文件与库文件,并安装到系统中,我们就可以使用这个库了 。
-
使用Cmake 生成一个库,并安装:
需要:
一个工程文件夹t3,一个子目录lib(lib里存放头文件(对库文件的定义与说明,说明库文件有什么)和库文件(提供可调用的算法,函数))、Cmake文件(CmakeLists.txt),一个build。
lib中有: CMakeLists.txt、hello.c与hello.h
2) 编写工程CMakeLists.txt:
PROHECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)
编写lib库中的文件:hello.c与hello.h
hello.c:
#include "hello.h"
void Hellofunc()
{
printf("Hello World\n");
}
hello.h:
#ifndef LIBHELLO_H_
#define LIBHELLO_H_
#include <stdio.h>
void Hellofunc();
#endif
编写lib库的CMakeLists.txt:
SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
注:生成的共享库名为libhello.so,因为cmake自动将hello改成libhello了。
然后进入buildw外部编译:
cmake ..
make
此时,build目录下的lib目录就已经有了libhello.so,这即是我们期望的共享库。注:如果想要静态库,只要改为:
ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})
注:如果想同时生成libhello.a和libhello.so,因为hello作为TARGET是不能重名的,所以只能:
GET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
至此总结,lib下的CMakeLists.txt的内容如下:
此时,就在build的lib中有了libhello.a和libhello.so了。对于动态库,如需要实现版本号:
安装:
注:在安装的时候的应该为:
sudo make install
- 使用库及头文件:
t3工程中的libhello.a及libhello.so安装至/usr/lib,头文件hello.h安装至/usr/include/hello。
我们新建一个t4工程,调用t3
t4下,一个CMakeLists.txt,一个build,一个src。
src下,一个CMakeLists.txt,一个main.c
主工程CMakeLists.txt:
src的CMakeLists.txt:
注:此处是链接的共享库,如要链接静态库:
将第四行代码改为:
main.c:
在build中进行外部构建,在build/src中生成可执行文件:main。运行:
./main
即可得到
Hello World
的结果。