动态库

2019-2020-1 20175227 《信息安全系统设计基础》第三周学习总结

若如初见. 提交于 2019-11-30 06:29:04
2019-2020-1 20175227 《信息安全系统设计基础》第三周学习总结 教材学习内容总结 GCC GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。 GCC编译代码的过程如下: 可以把编译过程分成四步,以编译hello.c生成可执行文件hello为例,如下图: 预处理: gcc –E hello.c –o hello.i gcc –E调用cpp 编 译: gcc –S hello.i –o hello.s gcc –S调用ccl 汇 编: gcc –c hello.s –o hello.o gcc -c 调用as 链 接: gcc hello.o –o hello gcc -o 调用ld GDB UNIX及UNIX-like下的调试工具。GDB这个调试工具相比于VC、z的优点是具有修复网络断点以及恢复链接等功能,比BCB的图形化调试器有更强大的功能。 功能 启动程序,可以设置运行环境和参数来运行指定程序 让程序在指定断点处停止执行 对程序作出相应调整,这样就能纠正一个错误后继续调试 注意使用 -g 编译选项的gcc命令来编译源程序 命令 Makefile 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译

CMake 入门教程

我的梦境 提交于 2019-11-30 03:12:29
本教程的测试环境 Ubuntu 18.04 LTS CMake 3.10.2 什么是 CMake? CMake 是一个构建工程的工具 如何安装 CMake? sudo apt install cmake 如何使用 CMake? 在指定目录下写 CMakeLists.txt,文件名区分大小写 内部编译会导致文件结构混乱,因此推荐外部构建 $ # 创建构建目录 $ mkdir -p build $ cd build $ $ # 设置安装前缀 $ cmake -DCMAKE_INSTALL_PREFIX=/usr .. $ $ # 生成 MakeFile $ make $ $ # 测试 $ make test $ $ # 安装 $ make install CMake 常用命令 CMake 命令不区分大小写,以下说明均用小写字母 ## 指定 CMake 的最小版本 cmake_minimum_required(VERSION min-version) ## 指定项目名称 project(project-name) ## 向用户输出提示信息 message(STATUS "message to display") ## 向用户输出错误信息,构建直接停止 message(FATAL_ERROR "message to display") ## 添加子目录 add_subdirectory

一种以动态库的方式使用资源表的方案

喜夏-厌秋 提交于 2019-11-30 02:17:37
这段时间研究了一下资源表的优化方案,算是有了一些成果,在此记录下来。 先交代一下背景吧:我们的服务器把资源表放在共享内存上。这么做的原因主要是,进程core掉后再拉起时不需要重新再构建一遍资源表(构建资源表主要就是构建索引查询的数据结构,比如构建一个哈希表用于根据HeroID查询英雄配置这种)。然后,考虑到同一个机器上可能部署多个进程,于是自然就想到,能否有一种机制能够让一个机器上的多个进程共享同一块资源表的内存? 一个比较直观的想法就是,让多个进程挂在同一块资源表共享内存。这样做确实是可以达到内存共享的目的,但是需要考虑资源表reload的情况。reload时会对这块内存做写操作,而我们知道,一写多读是会有并发问题。因此这种方案还需要再引入一种机制来处理并发问题。常见的比如是双缓冲区,构建好后再一次性切换到新的资源表内存上。了解到了一些项目组确实也是这么做的,具体就不细说了。 而我想到的方法是这样的:使用代码生成技术,将资源表完全的导成c++的代码。所有用到于查询的数据结构都是通过自动代码生成的,并且在编译期就被静态构建好了。进程运行时直接载入这块内存即可,不需要像以前那样在起服时跑资源表构建的流程。因此,这块内存也不需要再手动放共享内存上了。core之后再拉起进程,最多就是资源表的内存被卸载了,并且会到下次用到时通过触发缺页中断被再次载入进内存。为了做同一机器上的内存共享

Android.mk语法说明

冷暖自知 提交于 2019-11-30 00:58:00
路径 MY_LOCAL_PATH := $(call my-dir) LOCAL_PATH := $(MY_LOCAL_PATH) MY_SOURCE_PATH := $((LOCAL_PATH)…/…/…/code/source) 静态库 include $(CLEAR_VARS) LOCAL_MODULE := liblive2d LOCAL_SRC_FILES := …/…/…/hero_external/Live2d/android/$(TARGET_ARCH_ABI)/liblive2d.a include $(PREBUILT_STATIC_LIBRARY) c 预编译宏 LOCAL_CFLAGS := -I$(LOCAL_PATH)/boost/include/boost-1_53 cpp 预编译宏 LOCAL_CPPFLAGS := -DL2D_TARGET_ANDROID_ES2 动态库 --start include $(CLEAR_VARS) LOCAL_MODULE := game_shared LOCAL_MODULE_FILENAME := libgame 导入cpp源文件 LOCAL_SRC_FILES := ./MianProj/main.cpp\ 头文件路径包含 LOCAL_C_INCLUDES := $(LOCAL_PATH)/…/…/…

python程序调用C/C++代码

谁都会走 提交于 2019-11-29 19:53:41
这篇用来记录在些模拟Canoe生成CAN数据桢工具时遇到的问题, 生成CAN数据桢,主要分为两个关注点: 1.如何从can信号名获取到can信号的ID长度以及信号的起始位,并将信号值按照一定的规则填写进去。 2.由于FCAN进行额checksum校验和activecount的规则,这部分算法使用C/C++最好,所以设计到python程序调用C/C++代码(也就是这篇文章) 1. 如何用 python 调用 C++ 代码: 这个是 python 官方库的 cytpes 模块的介绍,可以关注一下“ Fundamental data types ” ( https://docs.python.org/3/library/ctypes.html ) 这个提供了一个简单的例子调用 C 语言代码 ( https://blog.csdn.net/theonegis/article/details/82490549 ) 这个 python 调用 C++ 指针和指针数组的调用 ( 变量比较乱,要好好看一下才能看出来 ) ( https://blog.csdn.net/weixin_41770169/article/details/90675653 ) 这个 python 调用 C 代码,传入一个数组给函数,因为传进去的实质是指针,作为参数的数组内容会改变,两个例子 ( https://blog

PHP调用Python失败的解决办法

99封情书 提交于 2019-11-29 19:20:51
假设有文件:php_test.php python_test.py 在php文件中运行Python: exec("python python_test.py", $array, $ret); 如果运行Python出错并不能保存在数组array中,因此应该把标准错误重定向到文件中,以上代码改写如下: exec("python python_test.py 2>error.txt", $array, $ret); 在bash中0,1,2三个数字分代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出)。也可以通过以下方式将标准错误重定向到标准输出保存到$array中: exec("python python_test.py 2>error.txt 2>&1", $array, $ret); 然后就可以根据错误信息去寻求解决办法。 一般在终端通过命令运行PHP文件是可以马上看到错误信息的,但是通过浏览器运行PHP文件就只能上面所述方法去输出错误信息。因此问题也就是在命令行下PHP可以成功执行Python文件,而通过浏览器就不能成功运行,这是因为两种方式所调用的动态库不一致!通过命令行方式调用的是系统中的已有的动态库

跨平台编译ceres for Android

好久不见. 提交于 2019-11-29 07:31:48
折腾了几乎一天,记录一下。 最大的坑是官网给出的    1.进入ceres源代码目录下的jni目录    2. EIGEN_PATH ="指向eigen库目录,即包含EIGEN文件夹的那个文件夹” ndk -build 这方法的确编译出了一个近700M的静态库,但使用时总是未定义链接错误。现在想想跟以前编译OpenCV时遇到的错误相似, 解决的办法也相似,通过cmake调用ndk的工具链编译。 我编译动态库的命令 /home/hk/Android/Sdk/cmake/3.10.2.4988404/bin/cmake -DCMAKE_TOOLCHAIN_FILE=/home/hk/Android/Sdk/ndk/20.0.5594570/build/cmake/android.toolchain.cmake -DEIGEN_INCLUDE_DIR=/home/hk/ndk/eigen-git-mirror-3.3.6 -DANDROID_ABI=arm64-v8a -DANDROID_STL=c++_shared -DANDROID_NATIVE_API_LEVEL=android-27 -DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF -DMINIGLOG=ON -DCMAKE_BUILD_TYPE

[动态库]深入分析Windows和Linux动态库应用异同

痴心易碎 提交于 2019-11-29 04:28:30
摘要:动态链接库技术实现和设计程序常用的技术,在 Windows 和 Linux 系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 但不同操作系统的动态库由于格式 不同,在需要不同操作系统调用时需要进行动态库程序移植。本文分析和比较了两种操作系统动态库技术,并给出了将 Visual C++ 编制的动态库移植到 Linux 上的方法和经验。 1 、引言 动态库( Dynamic Link Library abbr , DLL )技术是程序设计中经常采用的技术。其目的减少程序的大小,节省空间,提高效率,具有很高的灵活性。 采用动态库技术对于升级 软件 版本更加容易。与静态库( Static Link Library )不同,动态库里面的函数不是执行程序本身的一部分,而是根据执行需要按需载入,其执行代码可以同时在多个程序中共享。 在 Windows 和 Linux 操作系统中,都可采用这种方式进行 软件 设计,但他们的调用方式以及程序编制方式不尽相同。本文首先分析了在这两种操作系统中通常采用的动态库调用方法以及程序编制方式,然后分析比较了这两种方式的不同之处,最后根据实际移植程序经验,介绍了将 VC++ 编制的 Windows 动态库移植到 Linux 下的方法。 2 、动态库技术 2.1 Windows 动态库技术

GCC/G++选项 -Wl,-Bstatic和-Wl,-Bdynamic

混江龙づ霸主 提交于 2019-11-29 04:27:16
默认情况下,GCC/G++链接时优先链接动态库,如果没有动态库,则链接相应的静态库。同时,GCC/G++也提供了链接选项 -Wl,-Bstatic 和 -Wl,-Bdynamic 供用户指定链接动态库或者静态库。 -Wl,-Bstatic指示跟在后面的-lxxx选项链接的都是静态库,-Wl,-Bdynamic指示跟在后面的-lxxx选项链接的都是动态库。 如下, g++ -L. -o main main.cc -Wl,-Bstatic -ltest -Wl,-Bdynamic 前面的 -Wl,-Bstatic指示链接libtest.a静态库,后面的 -Wl,-Bdynamic指示链接系统动态库。 来源: oschina 链接: https://my.oschina.net/u/2758063/blog/2239740

python 调用c++ dll 动态库

扶醉桌前 提交于 2019-11-29 00:28:46
一丶C++ 编译类动态库 1)新建生成.dll文件的空项目 双击: 2)编写头文件:pycall.h //test.h #pragma once class Mymath { int sum(int, int); int sub(int, int); }; 1234567 注:#define DLLEXPORT extern “C” __declspec(dllexport) 1. windows下需要使用__declspec(dllexport)的声明来说明这个函数是动态库导出的 2.extern “C”声明避免编译器对函数名称进行name mangling,这对于使用C++来编写DLL/SO是必须的。 3)编写实现文件:pycall_so.cpp #define DLLEXPORT extern "C" __declspec(dllexport) #include"pycall.h" //两数相加 DLLEXPORT int sum(int a, int b) { return a + b; } //两数相减 DLLEXPORT int sub(int a, int b) { return a-b; }12345678910 然后生成解决方案: 生成了动态链接库和静态链接库 二丶python利用Ctypes调用C++动态库 把刚才生成的动态链接库放到.py文件夹下: