CMakeLists.txt内容如下:

#cmake for GLTranslation
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build/out)aux_source_directory(module/GLTranslation GLTRANSLAYION_SOURCE_FILES)add_library(GLTranslation SHARED ${GLTRANSLAYION_SOURCE_FILES})

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build/out)指定了生成.so的路径

add_library 使用指定的源文件向工程中添加一个库。

add_library( [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 … sourceN)
  添加一个名为的库文件,该库文件将会根据调用的命令里列出的源文件来创建。对应于逻辑目标名称,而且在一个工程的全局域内必须是唯一的。待构建的库文件的实际文件名根据对应平台的命名约定来构造(比如lib.a或者.lib)。指定STATIC,SHARED,或者MODULE参数用来指定要创建的库的类型。STATIC库是目标文件的归档文件,在链接其它目标的时候使用。SHARED库会被动态链接,在运行时被加载。MODULE库是不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数动态链接。如果没有类型被显式指定,这个选项将会根据变量BUILD_SHARED_LIBS的当前值是否为真决定是STATIC还是SHARED。

使用下述格式,add_library命令也可以用来创建导入的库目标:

add_library( <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED)
  导入的库目标是引用了在工程外的一个库文件的目标。没有生成构建这个库的规则。这个目标名字的作用域在它被创建的路径及以下有效。他可以向任何在该工程内构建的目标一样被引用。导入库为类似于target_link_libraries命令中引用它提供了便利。关于导入库细节可以通过指定那些以IMPORTED_的属性设置来指定。其中最重要的属性是IMPORTED_LOCATION(以及它的具体配置版本,IMPORTED_LOCATION_),它指定了主库文件在磁盘上的位置。查阅IMPORTED_*属性的文档获取更多的信息。

下面是实例,把OpenGL绘图的程序打包成libGLTranslation.so动态库

头文件GLTranslation.h

//
// Created by czh on 1/18/19.
//#ifndef GLTRANSLATION_H
#define GLTRANSLATION_H#include "iostream"
#include <glad/glad.h>
#include <string>void GLinit(int width, int height);void GLTextureUpdate(uint width, uint height, int channel, unsigned char *data);void GLdrawRender();void GLFree();#endif //GLTRANSLATION_H

源文件GLTranslation.cpp

//
// Created by czh on 2/1/19.
//
#include "GLTranslation.h"void GLinit(int width, int height);void GLTextureUpdate(uint width, uint height, int channel, unsigned char *data);void GLdrawRender();void GLFree();GLuint shaderID;
GLuint textureID;
GLuint VAO;
GLuint VBO;std::string defaultVshader2D ="#version 300 es                                    \n""layout (location = 0) in vec4 vertex;              \n""out vec2 TexCoords;                                \n""void main()                                        \n""{                                                  \n""   TexCoords = vertex.zw;                          \n""   gl_Position = vec4(vertex.xy, 0.0, 1.0);        \n""}                                                  \n";std::string defaultFshader2D ="#version 300 es                                    \n""precision mediump float;                           \n""in vec2 TexCoords;                                 \n""out vec4 color;                                    \n""uniform sampler2D image;                           \n""void main()                                        \n""{                                                  \n""   color = texture(image, TexCoords);              \n""}                                                  \n";GLfloat defaultVertices2D[16] = {// Pos      // Tex-1.0f, -1.0f, 0.0f, 1.0f,1.0f, -1.0f, 1.0f, 1.0f,-1.0f, 1.0f, 0.0f, 0.0f,1.0f, 1.0f, 1.0f, 0.0f
};GLuint defaultIndices2D[6] = {2, 0, 1,2, 3, 1
};void GLStatusInit(int width, int height) {glViewport(0, 0, width, height);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}void GLcheckCompileErrors(uint object, std::string type) {GLint success;GLchar infoLog[1024];if (type != "PROGRAM") {glGetShaderiv(object, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(object, 1024, NULL, infoLog);std::cout << "#Err! SHADER: CompileErrors: Type: " << type << "\n"<< infoLog << std::endl;}} else {glGetProgramiv(object, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(object, 1024, NULL, infoLog);std::cout << "#Err! Shader: CompileErrors: Type: " << type << "\n"<< infoLog << std::endl;}}
}void GLShaderInit() {GLuint sVertex, sFragment;const char *vchar = defaultVshader2D.data();const char *fchar = defaultFshader2D.data();sVertex = glCreateShader(GL_VERTEX_SHADER);glShaderSource(sVertex, 1, &vchar, nullptr);glCompileShader(sVertex);GLcheckCompileErrors(sVertex, "VERTEX");sFragment = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(sFragment, 1, &fchar, NULL);glCompileShader(sFragment);GLcheckCompileErrors(sFragment, "FRAGMENT");shaderID = glCreateProgram();std::cout << "#glCreateProgram ID:" << shaderID << std::endl;glAttachShader(shaderID, sVertex);glAttachShader(shaderID, sFragment);glLinkProgram(shaderID);GLcheckCompileErrors(shaderID, "PROGRAM");glDeleteShader(sVertex);glDeleteShader(sFragment);
}void GLTextureInit() {glGenTextures(1, &textureID);glBindTexture(GL_TEXTURE_2D, textureID);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}#define GL_BGRA_IMG                       0x80E1void GLTextureUpdate(uint width, uint height, int channel, unsigned char *data) {if (channel == 4) {glBindTexture(GL_TEXTURE_2D, textureID);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_IMG, GL_UNSIGNED_BYTE, data);//glTexDirectVIV(GL_TEXTURE_2D, width, height, GL_RGBA, (GLvoid **)(&data));} else {glBindTexture(GL_TEXTURE_2D, textureID);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);}
}void GLRenderInit() {glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(defaultVertices2D), defaultVertices2D, GL_STATIC_DRAW);glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (GLvoid *) (0 * sizeof(float)));glEnableVertexAttribArray(0);
}void GLdrawRender() {glUseProgram(shaderID);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, textureID);glBindVertexArray(VAO);glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, defaultIndices2D);glBindVertexArray(0);
};void GLinit(int width, int height) {GLStatusInit(width, height);GLShaderInit();GLTextureInit();GLRenderInit();
}void GLFree() {//free shaderglDeleteProgram(shaderID);//free textureglBindTexture(GL_TEXTURE_2D, 0);glDeleteTextures(1, &textureID);//free renderglBindBuffer(GL_ARRAY_BUFFER, 0);glDeleteBuffers(1, &VAO);glDeleteBuffers(1, &VBO);
}

编译,然后在工程目录的build/out路径下找到生成的GLTranslation.so
需要用的时候加上头文件GLTranslation.h
查看链接的依赖项

 readelf -d build/out/libGLTranslation.so

结果如下:

Dynamic section at offset 0x3c88 contains 27 entries:Tag        Type                         Name/Value0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]0x000000000000000e (SONAME)             Library soname: [libGLTranslation.so]0x000000000000000c (INIT)               0x1a280x000000000000000d (FINI)               0x26140x0000000000000019 (INIT_ARRAY)         0x203c680x000000000000001b (INIT_ARRAYSZ)       16 (bytes)0x000000000000001a (FINI_ARRAY)         0x203c780x000000000000001c (FINI_ARRAYSZ)       8 (bytes)0x000000006ffffef5 (GNU_HASH)           0x1f00x0000000000000005 (STRTAB)             0xa600x0000000000000006 (SYMTAB)             0x2b00x000000000000000a (STRSZ)              1877 (bytes)0x000000000000000b (SYMENT)             24 (bytes)0x0000000000000003 (PLTGOT)             0x2040000x0000000000000002 (PLTRELSZ)           504 (bytes)0x0000000000000014 (PLTREL)             RELA0x0000000000000017 (JMPREL)             0x18300x0000000000000007 (RELA)               0x13200x0000000000000008 (RELASZ)             1296 (bytes)0x0000000000000009 (RELAENT)            24 (bytes)0x000000006ffffffe (VERNEED)            0x12600x000000006fffffff (VERNEEDNUM)         30x000000006ffffff0 (VERSYM)             0x11b60x000000006ffffff9 (RELACOUNT)          40x0000000000000000 (NULL)               0x0

可以看出依赖的库文件
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

使用cmake生成.so动态库相关推荐

  1. 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )

    文章目录 I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edi ...

  2. windows7下,Java中利用JNI调用c++生成的动态库的使用步骤

    1.从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-wi ...

  3. 「Python」python调用单个C++文件生成的动态库(.so)Part I

    环境说明 系统:Ubuntu 18.04 python:python 2.7.17 额外环境 上面的环境是普通测试,但是最终标题中的任务我需要在docker中执行,很多块内容我也不太懂,所以一步一步测 ...

  4. 【Qt】Qt6调用Visual Studio2019生成的动态库详解

    00. 目录 文章目录 00. 目录 01. 开发环境 02. Visual Studio 2019生成动态库 03. 新建Qt项目 04. 编写测试程序 05. 其它参考 06. 附录 01. 开发 ...

  5. Golang生成C动态库.so和静态库.a

    Go 生成C动态库.so和静态库.a 源代码 package mainimport "C" import "fmt"//export hello func he ...

  6. 记录一次C语言调用go生成的动态库的踩坑过程

    记录一次C语言调用go生成的动态库的踩坑过程 问题现象 由于某些特殊原因,需要在C语言中调用go语言生成的so,本来挺顺利,一切都运行的很好.突然某一天,不知道怎么回事,再一个新程序中无法正常运行了, ...

  7. qt中调用matlab生成的动态库

    前言: 前面已经实现了在vc中调用matlab生成的动态库,请参考:vc中调用matlab生成的动态库 现在在前面已经生成好的matlab动态库的基础上,在qt中调用matlab生成的动态库.生成ma ...

  8. QT 生成.so动态库默认生成.so .so.1 .so.1.0 .so.1.0.0

    QT 生成.so动态库时,会默认生成.so .so.1 .so.1.0 .so.1.0.0四个文件,其中其他三个文件都是指向.so.1.0.0这个实际的库文件的链接文件,为了版本控制. 要想直接生成. ...

  9. 用GCC生成静动态库练习

    用GCC完成各项指令操作 一.用gcc生成.a静态库和.so动态库 例一 第 1 步:编辑生成例子程序 hello.h.hello.c 和 main.c 第 2 步:将hello.c编译成.o文件 第 ...

  10. vs使用mingw生成的动态库

    1.使用mingw编译生成动态库*.dll: 2.使用vs工具通过*.dll生成*.lib; 创建vs需要的lib文件 创建def文件,这要用一个第三方的工具pexports,可以在mingw中使用命 ...

最新文章

  1. 客户跟进节奏(转至索菲外贸日记)
  2. 2021-11-13包装类
  3. 只有本地用户才能安装sql_为何只有安装了新风换气机才能打造好的家居环境?听听厂家怎么说...
  4. sql server中创建数据库和表的语法
  5. LeetCode 388. 文件的最长绝对路径(不用栈,前缀和)
  6. 【java】java 关键字: final详解
  7. 400本以上电子书、1000门以上课程会员免费看,快来领取!
  8. 为什么rand()+ rand()产生负数?
  9. OAuth2 授权码模式为什么不直接返回access_token
  10. oracle 的逻辑结构设计,浅谈Oracle数据库逻辑结构
  11. lqr控制和模糊控制三级倒立摆
  12. patch补丁文件格式
  13. 微信小程序弹窗(提示框和确认框)
  14. 批量修改横断面图高程范围
  15. 通用单目标跟踪综述《Handcrafted and Deep Trackers: A Review of Recent Object Tracking Approaches》
  16. 无需ROOT安卓备份Soul应用数据并提取聊天记录
  17. java autoconf_「Autoconf」- 安装 @20210202
  18. 网络工程师 100问
  19. python期末大作业-图形化爬虫
  20. 中国移动支付行业市场深度分析及发展规划咨询综合研究报告

热门文章

  1. 读书笔记-富爸爸穷爸爸-财富自由之路
  2. This service allows sftp connections only
  3. 制作自己的openwrt刷机包_openwrt刷机教程
  4. C++ imagemagick png图片压缩,背景变黑问题
  5. 计算机中应用g,CH340g使用说明详解 - 全文
  6. svchost.exe 大量占用的问题
  7. UVA - 10827 Maximum sum on a torus(dp最大子矩阵和)
  8. 计算机按电源键无法反应,笔记本无法正常开机,按下电源键无任何反应要过一段时间才可以开机...
  9. GCA matting(2020, trimap)
  10. 2018-2019-2 网络对抗技术 20165322 Exp3 免杀原理与实践