《CMake Practice》2021-03-14

三、静态库与动态库的创建

1.在/backup/cmake下建立t3目录,并在t3目录下建立lib目录

2.在t3目录下建立CMakeLists.txt:

PROJECT(HELLOLIB)

ADD_SUBDIRECTORY(lib)

3.在lib目录下建立hello.c和hello.h

 

hello.c:

#include “hello.h”

void HelloFunc()

{

printf(“Hello World\n”);

}

 

hello.h:

#ifndef HELLO_H

#define HELLO_H

#include 

void HelloFunc();

#endif

4.在lib目录下建立CMakelists.txt

SET(LIBHELLO_SRC hello.c)

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

 

/*ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)

不需要写全 libhello.so,只需要填写 hello 即可,cmake 系统会自动为你生成 libhello.X

SHARED,动态库 STATIC,静态库

*/

5.编译:

建立build文件夹,在build文件下

cmake ..

make

在lib目录得到一个libhello.so,这就是我们期望的共享库。

6.添加静态库(后缀名是.a)

/*更改lib/CMakeLists.txt*/

ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})

/*会发现,静态库根本没有被构建,仍然只生成了一个动态库。因为 hello 作为一个target是不能重名的,所以,静态库构建指令无效。*/

 

ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})

/*如果我们把上面的 hello 修改为 hello_static,就可以构建一个 libhello_static.a 的静态库了。*/

 

SET_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)

/*解决libhello.a 已经构建完成,位于 build/lib 目录中,但是 libhello.so 去消失了。这个问题的原因是:cmake 在构建一个新的 target 时,会尝试清理掉其他使用这个名字的库,因为,在构建 libhello.a 时, 就会清理掉 libhello.so.*/

 

7.安装共享库和头文件

7.1.向 lib/CMakeLists.txt 中添加如下指令:

INSTALL(TARGETS hello hello_static

LIBRARY DESTINATION lib

ARCHIVE DESTINATION lib)

INSTALL(FILES hello.h DESTINATION include/hello)

7.2.安装

cmake -DCMAKE_INSTALL_PREFIX=/usr ..

make

make install

我们就可以将头文件和共享库安装到系统目录/usr/lib 和/usr/include/hello 中了。

 

四、使用外部共享库和头文件

1.在/backup/cmake目录建立t4目录

2.建立src目录,编写main.c:

#include

int main()

{

HelloFunc();

return 0;

}

3.工程主文件CMakeLists.txt:

PROJECT(NEWHELLO)

ADD_SUBDIRECTORY(src)

4.src/CMakeLists.txt:

ADD_EXECUTABLE(main main.c)

/*加入头文件搜索路径*/

INCLUDE_DIRECTORIES(/usr/include/hello)

/*添加共享库链接*/

TARGET_LINK_LIBRARIES(main libhello.so)

/*添加静态库链接*/

TARGET_LINK_LIBRARIES(main libhello.a)

5.进入build目录重新进行构建

cmake ..

make

 

 

你可能感兴趣的:(cmake,cmake)