一. 准备工作
1)在D:\vs_test\cmake_test目录下,新建t3文件夹;
2)在t3下,新建目录lib、build和文件CMakeLists.txt。lib是用来存放源文件的。
3)在目录lib下,新建CMakeLists.txt和hello.cpp、hello.h。
t3目录下的CMakeLists.txt 文件内容:
PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib bin)
lib/CMakeList.txt 内容:
SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
lib/hello.cpp 内容:
#include "hello.h"
void HelloFunc()
{
std::cout << "Hello World !\n";
while (1);
}
lib/hello.h 内容:
#ifndef HELLO_H
#define HELLO_H
#include <iostream>
using namespace std;
void HelloFunc();
#endif
二. 编译共享库
具体的构建方法参考我第一篇文章:【Cmake】在Windows下用Cmake构建C++工程项目——cmake 的 helloworld——1
cmake编译成功之后,可以看到 t3\build\bin\Debug 目录下生成了动态库 hello.dll
注意:如果是在Linux环境下,那么得到的就是 hello.so,这就是我们期望的共享库。
三. 语法解释
主要是对 lib/CMakeList.txt 的语法解释。
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
SHARED,表示 动态库
STATIC,表示 静态库
MODULE,表示 在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手
工构建。
在我们这个例子中,ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})是指:
hello是可执行文件;SHARED会生成动态库;${LIBHELLO_SRC}是指 hello.cpp
四. 添加静态库
同样使用上面的指令,我们在支持动态库的基础上再为工程添加一个静态库,并将名称也取为与动态库一样hello。
lib/CMakeList.txt 内容:
SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
如果是添加静态库,用这句:ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})。
如果只有这一句,那么静态库根本不会被构建,仍然只生成一个动态库。因为 hello 作为一个 target 是不能重名的,所以,静态库构建指令无效。
可以改为:ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) 。这样同样可以生成一个静态库hello_static.lib,但和动态库的名字不一样。但是,我们需要的是名字相同的静态库和动态库。
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
这个指令就是把生成的hello_static改个名字,改为hello,这样动态库和静态库名字就一样了。
编译之后,如图:
任务完成。