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