Cmake

11 篇文章 0 订阅
5 篇文章 0 订阅

抄来的,抄来的,抄来的。

改错:添加输出目录参考这个:https://www.cnblogs.com/tangxin-blog/p/8283460.html

1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc

向终端输出Hello World字符串。

2,安装头文件与共享库。

3, 编写一个程序使用创建的共享库(静态库和动态库)。

 

cd /home/ccj/CMakeDemo

mkdir t3

 

 

cd /backup/cmake/t3

mkdir lib

 

在t3目录下建立CMakeLists.txt,内容如下:

PROJECT(HELLOLIB)

# 通过在主工程文件CMakeLists.txt中修改ADD_SUBDIRECTORY (lib) 指令来指定一个编译输出位置;

# 指定本工程中静态库libhello.so生成的位置,即 build/lib;

ADD_SUBDIRECTORY(lib)

# 也可以通过变更为其他的位置,如

# ADD_SUBDIRECTORY(lib lib_new)

# 则,静态库libhello.so生成的位置变为 build/lib_new;

 

在lib目录下建立两个源文件hello.cpp与 hello.h

hello.cpp内容如下:

#include "hello.h"

using namespace std;

void HelloFunc(){

cout << "Hello World/n";

}

hello.h内容如下:

#ifndef HELLO_H

#define HELLO_H

#include <stdio.h>

void HelloFunc();

#endif

 

在lib目录下建立CMakeLists.txt,内容如下:

注意: 这里我们将Section 7之前的CMakeLists.txt中应有的内容提供如下:

SET (LIBHELLO_SRC hello.cpp)

# SET (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

 

# three kinds of libraries:

# 1. shared, i.e., dynamic library,动态库文件扩展名常为 "*.so";

# 2. static, i.e., static library, 静态库文件扩展名常为 "*.a";

# 而且,我们通常希望静态库和动态库文件名保持一致,只是扩展名不同;

# 3. module, this parameter is valid only when dyld is supported;

# otherwise, will be considered as shared

# 添加动态库,关键词为shared,你不需要写全libhello.so,

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

ADD_LIBRARY (hello SHARED ${LIBHELLO_SRC})

# 添加静态库,关键词为static,

# ADD_LIBRARY (hello STATIC ${LIBHELLO_SRC})

# 仍然用hello作为target名时,是不能成功创建所需的静态库的,

# 因为hello作为一个target是不能重名的, 故把上面的hello修改为hello_static

# 同理,你不需要写全libhello_static.a

# 只需要填写hello即可,cmake系统会自动为你生成 libhello_static.X

ADD_LIBRARY (hello_static STATIC ${LIBHELLO_SRC})

 

# 按照一般的习惯,静态库名字跟动态库名字应该是一致的,只是扩展名不同;

# 即:静态库名为 libhello.a; 动态库名为libhello.so ;

# 所以,希望 "hello_static" 在输出时,不是"hello_static",而是以"hello"的名字显示,故设置如下:

SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")

 

GET_TARGET_PROPERTY (OUTPUT_VALUE hello_static OUTPUT_NAME)

MESSAGE (STATUS "This is the hello_static OUTPUT_NAME: " ${OUTPUT_VALUE})

 

# cmake在构建一个新的target时,会尝试清理掉其他使用这个名字的库,

# 因此,在构建libhello.a时,就会清理掉libhello.so.

# 为了回避这个问题,比如再次使用SET_TARGET_PROPERTIES定义 CLEAN_DIRECT_OUTPUT属性。

SET_TARGET_PROPERTIES (hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)

SET_TARGET_PROPERTIES (hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)

 

# 按照规则,动态库是应该包含一个版本号的,

# VERSION指代动态库版本,SOVERSION指代API版本。

SET_TARGET_PROPERTIES (hello PROPERTIES VERSION 1.2 SOVERSION 1)

 

# 我们需要将libhello.a, libhello.so.x以及hello.h安装到系统目录,才能真正让其他人开发使用,

# 在本例中我们将hello的共享库安装到<prefix>/lib目录;

# 将hello.h安装<prefix>/include/hello目录。

INSTALL (TARGETS hello hello_static LIBRARY DESTINATION lib

ARCHIVE DESTINATION lib)

INSTALL (FILES hello.h DESTINATION include/hello)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值