Cmake的库的理解

  1. 理论:
    C++中,只有带有main函数的文件才可生成可执行程序,其他的代码,我们把它打包,供其他程序调用,这就是
    如:opencv库、Eigen库。
    注:库里(t3工程中)是没有main.c这样的文件的,因为它是作为库被其他人调用的。

  2. Linux中,库文件分为静态库共享库(动态库)
    静态库以.a后缀结尾,共享库以.so后缀结尾。静态库每被调用一次生成一个副本,共享库只有一个副本。

  3. 只要有了头文件与库文件,并安装到系统中,我们就可以使用这个库了 。

  4. 使用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
  1. 使用库及头文件:

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
的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值