- 浏览: 692584 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (181)
- Matlab (16)
- Java (26)
- autoHotkey (4)
- openCV (1)
- C++ (50)
- PDF-XChange Viewer (2)
- 学术 (11)
- javascript (4)
- linux (11)
- SWT (9)
- latex (7)
- GAE (2)
- windows (6)
- C# (3)
- PS (20)
- JNI (4)
- latex,批处理 (0)
- 批处理 (4)
- Android (5)
- 矩阵论 (1)
- SVM (1)
- 概率图模型 (0)
- Python (12)
- Eigen (5)
- 编程题 (1)
- MKL (1)
- 神经网络 (9)
- 最优化 (2)
- 摄影 (1)
- PPT (0)
- After Effects (3)
- CUDA (3)
- caffe (0)
- MXNet (2)
- svn (1)
- R (0)
- 虚拟机 (0)
- tensorflow (7)
- theano (1)
- Keras (1)
- vim (1)
- xgboost (1)
- spark (6)
- eclipse (2)
- word2vec (0)
- hadoop (1)
- dmlc (1)
- git (0)
最新评论
-
jeffersonz:
请问大神,这个插件记录下来的脚本为什么不能再Extendscr ...
PhotoShop - 记录PS的所有操作为JavaScript代码 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道cherish ...
Eigen的编译选项;MKL的使用 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道 您好,您的工 ...
Eigen的编译选项;MKL的使用
1、C++文件的编译
g++参数介绍(非常棒~)
http://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html
官方文档:https://gcc.gnu.org/onlinedocs/
官方参数大全(gcc5.3):https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Option-Summary.html#Option-Summary
-E 预处理, 将#include的文件展开等
-S 生成汇编文件
-c 生成object文件
gcc XX.o -o XX 链接,,输出文件名为XX
-O1, -O2, -O3 优化代码 ,-O3级别最高, -O1为默认
-g 及 -ggdb 等,,生成调试信息
-fPIC 及 -fpic , 生成动态链接库时使用,, 前者在多平台通用,但程序运行速度慢
-M , -MM, 输出 文件的依赖关系(比如各种.h)文件(写makefile时可以使用)
-std=c++14(或-std=gnu++14) -std=c++11(或-std=gnu++11)启用 c++14/11的信息,其中使用gnu++14会启用gcc的扩展 :
https://gcc.gnu.org/projects/cxx0x.html
https://gcc.gnu.org/projects/cxx1y.html
一般直接用-c 生成object文件,再多个object文件链接一下即可
或者不指定参数,直接从 多个.cpp 文件生成可执行文件
-Wall 输出尽可能多的警告
-I 头文件路径
-L 库文件路径(静态、动态)
-l 库文件(无需包含扩展名.so 或.a )(但是我自己在Ubuntu14.04.1中直接使用XX.so即可,而不是-lXX.so)
2、静态链接库、动态链接库的编译
Program Library HOWTO:http://www.dwheeler.com/program-library/
C++ dlopen mini HOWTOhttp://www.tldp.org/HOWTO/C++-dlopen/
这篇文章中讲了由于C++的Name Mangling,,需要 extern "C"等封装才能正常使用fopen函数调用C++函数的问题
很多网上的教程会用到 -l 选项指定库文件!!!但是我试的时候直接指定库文件全名就行!!!(具体见makefile内容)
nm 查看exe、.o、.so、 .a文件中的符号信息,比如C++函数名被编译器mangle之后的名称
nm XX.so | c++filt 可以查看函数的原始名称
关于mangling更多请参见http://blog.csdn.net/chenxintao/article/details/7585483
关于库文件搜索路径的问题,没详细实验,在Ubuntu下貌似当前路径也可以~ 这个,用到再试了
只是简单记一下LD_LIBRARY_PATH 的修改方式:http://baike.baidu.com/view/1270749.htm
不多说了,上代码(完整代码见附件):
库文件:
采用静态链接库:
采用动态链接库(源文件和采用静态链接库完全相同):
采用动态加载.so文件(fopen):
makefile:
看不懂的搜下 “跟我一起写makefile”,,我也是简单学了一下而已
终端内输入 make runall就可以执行程序了
3、设置可执行程序在当前路径下查找.so文件
自己生成了个.so文件,,还得先加到库路径里才能用?
编译可执行文件时只需要添加-rpath=.选项即可!!!!
完整代码为(-WI选项需不需要我没试):
引用自:http://blog.csdn.net/cjf_iceking/article/details/25219675
g++参数介绍(非常棒~)
http://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html
官方文档:https://gcc.gnu.org/onlinedocs/
官方参数大全(gcc5.3):https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Option-Summary.html#Option-Summary
-E 预处理, 将#include的文件展开等
-S 生成汇编文件
-c 生成object文件
gcc XX.o -o XX 链接,,输出文件名为XX
-O1, -O2, -O3 优化代码 ,-O3级别最高, -O1为默认
-g 及 -ggdb 等,,生成调试信息
-fPIC 及 -fpic , 生成动态链接库时使用,, 前者在多平台通用,但程序运行速度慢
-M , -MM, 输出 文件的依赖关系(比如各种.h)文件(写makefile时可以使用)
-std=c++14(或-std=gnu++14) -std=c++11(或-std=gnu++11)启用 c++14/11的信息,其中使用gnu++14会启用gcc的扩展 :
https://gcc.gnu.org/projects/cxx0x.html
https://gcc.gnu.org/projects/cxx1y.html
一般直接用-c 生成object文件,再多个object文件链接一下即可
或者不指定参数,直接从 多个.cpp 文件生成可执行文件
-Wall 输出尽可能多的警告
-I 头文件路径
-L 库文件路径(静态、动态)
-l 库文件(无需包含扩展名.so 或.a )(但是我自己在Ubuntu14.04.1中直接使用XX.so即可,而不是-lXX.so)
2、静态链接库、动态链接库的编译
Program Library HOWTO:http://www.dwheeler.com/program-library/
C++ dlopen mini HOWTOhttp://www.tldp.org/HOWTO/C++-dlopen/
这篇文章中讲了由于C++的Name Mangling,,需要 extern "C"等封装才能正常使用fopen函数调用C++函数的问题
很多网上的教程会用到 -l 选项指定库文件!!!但是我试的时候直接指定库文件全名就行!!!(具体见makefile内容)
nm 查看exe、.o、.so、 .a文件中的符号信息,比如C++函数名被编译器mangle之后的名称
nm XX.so | c++filt 可以查看函数的原始名称
关于mangling更多请参见http://blog.csdn.net/chenxintao/article/details/7585483
关于库文件搜索路径的问题,没详细实验,在Ubuntu下貌似当前路径也可以~ 这个,用到再试了
只是简单记一下LD_LIBRARY_PATH 的修改方式:http://baike.baidu.com/view/1270749.htm
不多说了,上代码(完整代码见附件):
库文件:
#pragma once int plus(int a,int b);
#include "sharedLib.h" int plus(int a,int b){ return a+b; }
采用静态链接库:
#include "sharedLib.h" #include <iostream> int main(void){ std::cout<<"Running "<<__FILE__<<std::endl; int p=plus(2,3); std::cout<<"The sum is "<<p<<std::endl<<std::endl; }
采用动态链接库(源文件和采用静态链接库完全相同):
#include "sharedLib.h" #include <iostream> int main(void){ std::cout<<"Running "<<__FILE__<<std::endl; int p=plus(2,3); std::cout<<"The sum is "<<p<<std::endl<<std::endl; }
采用动态加载.so文件(fopen):
#include <iostream> #include <dlfcn.h> #include "sharedLib.h" typedef int (*F)(int,int); using FF=int (*)(int,int); int checkDLLState(void* dp){ const char* dlsym_error= dlerror(); if (dlsym_error) { std::cerr << "Cannot load symbol : " << dlsym_error <<std::endl; dlclose(dp); return 1; } return 0; } int main(void){ std::cout<<"Running "<<__FILE__<<std::endl; const char* dllName="./sharedLib.so"; // reset errors dlerror(); void* dp=dlopen(dllName, RTLD_LAZY); if(checkDLLState(dp))return -1; std::cout<<"dp = "<<(unsigned long long)(dp)<<std::endl; F f; f=(F)( dlsym(dp,"_Z4plusii")); // if do not want to use this name, add extern "C" before the function "plus" if(checkDLLState(dp))return -1; int sum=f(1,2); std::cout<<"The sum is "<<sum<<std::endl<<std::endl; dlclose(dp); }
makefile:
看不懂的搜下 “跟我一起写makefile”,,我也是简单学了一下而已
终端内输入 make runall就可以执行程序了
all: main_link_a main_link_so main_dynamicLoad runall: all echo "now beggin running all executations" ./main_link_a ./main_link_so ./main_dynamicLoad #use static library main_link_a: main_link_a.cpp sharedLib.a g++ -Wall -o main_link_a main_link_a.cpp ./sharedLib.a sharedLib.a: sharedLib.cpp sharedLib.h g++ -Wall -static -c -o sharedLib.o sharedLib.cpp ar rcs sharedLib.a sharedLib.o #use dynamic library main_link_so: main_link_so.cpp sharedLib.so g++ -Wall -o main_link_so main_link_so.cpp ./sharedLib.so -ldl sharedLib.so: sharedLib.cpp sharedLib.h g++ -Wall -shared -fPIC -o sharedLib.so sharedLib.cpp #use fopen, dynamic load .so libarary, use function by name main_dynamicLoad: main_dynamicLoad.cpp sharedLib.so g++ -Wall -std=c++11 -o main_dynamicLoad main_dynamicLoad.cpp ./sharedLib.so -ldl #-ldl for dynamic link #view mangled c++ function name in sharedLib.so viewFuncName: sharedLib.so echo viewing mangled function name nm sharedLib.so #view mangled function name echo echo viewing demangled function name nm sharedLib.so | c++filt #view demangled name clean: -rm *.so *.o *.a #the minus sign at the beginning means the commnand after this one will be executed even error occurs. -rm main_link_a main_link_so main_dynamicLoad -rm *~
3、设置可执行程序在当前路径下查找.so文件
自己生成了个.so文件,,还得先加到库路径里才能用?
编译可执行文件时只需要添加-rpath=.选项即可!!!!
完整代码为(-WI选项需不需要我没试):
gcc -o test test.c -I. -L. -la -Wl,-rpath=.
引用自:http://blog.csdn.net/cjf_iceking/article/details/25219675
- DLL_Example.7z (1.3 KB)
- 下载次数: 0
发表评论
-
C++函数中的静态变量
2019-07-19 11:22 821在C++中,可以在成员函数中使用静态变量,从而间接达到在hpp ... -
tensorflow 静态编译笔记 -- linux系统
2018-11-05 14:26 0注: 1、编译tensorflow静态库 很简单,参见: h ... -
bash知识汇总
2018-07-09 17:45 0默认参数:exe_file=${3:-"myexe& ... -
gperftools笔记
2018-06-27 14:30 0export LD_LIBRARY_PATH=LD_LIBR ... -
dmlc分布式线性模型编译笔记
2018-06-06 10:37 21781、使用第三方修改后的wormhole工程 原始工程wor ... -
C++中读取控制台输出,并将文件指针FILE*转换为istream
2017-11-27 15:03 1845解决的问题: 1、通过执行系统的bash命令后,获取其输出( ... -
c++中使用boost库在共享内存中存储map
2017-11-09 11:37 5429boost库中的interprocess包可以在共享内存中创建 ... -
linux 定时任务--crontab
2017-08-14 18:05 1045网上资料很多,只做摘录: 排版最好的:http://www ... -
近似最近邻算法库FLANN
2017-04-25 18:45 0FLANN库是计算近似最近邻的库, 问题定义如下: 给定距离函 ... -
C++杂记-- 重定向std::cout等
2017-04-18 17:28 19731、屏蔽std::cout 参见:http://stackov ... -
linux下将python作为后台服务
2016-12-16 14:00 15901、启动后台服务 不会写shell脚本,直接调用python: ... -
利用 grep 命令分析、搜索日志文件内容
2016-12-08 21:06 1813如果日志文件过大,gedit等文本编辑器卡的那叫一个酸爽!!! ... -
zip 与 unzip相关命令
2016-11-23 10:13 6501、zip 压缩 基本命令: zip 压缩文件.zip 待压 ... -
vim 相关
2018-03-22 15:29 4241、中文显示乱码 在~/.vimrc 文件中,加入以下内容: ... -
ubuntu16.04 安装搜狗输入法
2016-08-25 14:38 89171、下载 deb安装包 http://pinyin.sogou ... -
Ubuntu 软件安装资料汇总
2016-07-28 01:11 01、JAVA http://www.cnblogs.com/a ... -
SecureCRT 相关资料
2016-07-20 15:56 6891、 向服务器传文件 rz 命令,,敲回车后会弹出窗口让选择命 ... -
CMake指定目标代码的平台(win32,x64)
2016-06-03 20:54 11730主要参考自:http://blog.c ... -
windows 10下安装GPU版MXNet
2016-06-03 21:28 8591上回说到编译CPU版的MXNet: http://cheris ... -
windows下安装CPU版mxnet
2016-05-23 23:14 17597MXnet (mix net)类似Caffe,Tensorfl ...
相关推荐
Linux Qt 是一个基于Qt框架的应用程序开发平台,而动态链接库和静态链接库是Linux平台上常用的库链接方式。了解动态链接库和静态链接库的使用是 Qt 开发者必备的技能。 一、动态链接库 动态链接库(Dynamic Link ...
同时,理解环境变量、编译链接过程、动态库静态库的使用也是编程环境搭建的关键。此外,学会使用版本控制系统如Git进行代码管理也是现代开发者的必备技能。 然后是C/C++基础知识。C++是C语言的扩展,支持面向对象...
动态库与静态库(.lib)不同,静态库在编译时会被直接合并到目标程序中,而动态库则是在程序运行时动态加载的。DLL可以减少程序的大小,因为多个程序可以共享同一份库的代码。C++从DLL导出类涉及到两个主要步骤:...
动态链接库(DLL)是Windows操作系统中的一种机制,它允许多个程序共享同一段代码和数据,从而节省内存和磁盘空间。DLL文件包含了可执行代码和数据,而LIB文件则是DLL的导入库,用于静态链接。 在静态链接时,...
C++是一种静态类型、编译式、通用的编程语言,它支持过程化...最后,链接阶段将多个目标文件及库文件链接成最终的可执行文件。 以上内容覆盖了C++语言中一些基础知识点,对于学习和理解C++编程具有重要的指导意义。
4. **多线程编程**:利用C++11及更高版本的std::thread和mutex等库进行并发处理。 5. **智能指针**:如std::unique_ptr、std::shared_ptr,用于自动管理对象的生命周期,防止内存泄漏。 6. **Boost库**:提供了许多...
成功编译后,在指定的安装路径`/root/sqlite-3.6.5/build/bin`下会生成可执行文件`sqlite3`,在`/root/sqlite-3.6.5/build/include`下生成头文件`sqlite3.h`,在`/root/sqlite-3.6.5/build/lib`下生成静态库`...
- 编译静态库时,链接选项应为-Wl,-Bstatic。 4. **测试和调试**: - 构建完成后,通过示例程序测试库功能是否正常。 - 使用调试工具检查链接和运行时错误。 5. **部署**: - 对于动态库,需要将库文件和对应...
9. **预处理器**:预处理器是C++编译过程的一部分,包括宏定义、条件编译等,理解其工作原理有助于编写更高效的代码。 10. **实践项目**:理论学习后,通过编写小程序或参与小型项目,巩固和应用所学知识。 《达内...
根据提供的文件信息,可以看出这份文档主要涉及C++中的一些关键概念和知识点,特别是关于静态成员、友元类、以及常量等内容。接下来,我们将详细解释这些知识点。 ### 静态成员 静态成员(包括静态数据成员和静态...
1. **环境准备**:安装必要的开发工具,如Visual Studio 2010,确保已配置好C++编译环境。 2. **获取依赖**:SNMP++可能依赖于其他库,如ASN.1编解码库(如berkeley-asn1或openasn1),需要先下载并编译这些依赖库...
创建静态库和动态库的过程也有所区别,静态库需要先编译生成目标文件(.o),然后使用ar工具将这些文件打包成库文件(.a)。动态库则需要编译时添加-fpic选项以生成位置无关的代码,然后使用gcc的-shared选项生成.so文件...
C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。它的设计理念是“让程序员能够做出选择”,因此,C++提供了多种编程范式,包括面向对象、泛型编程和...
3. 静态与动态链接:了解编译时和运行时的链接方式,理解静态库与动态库的区别。 4. 文件I/O:学习使用fstream库进行文件读写操作。 5. 命名空间:避免命名冲突,更好地组织代码。 6. C++11及后续标准的新特性:...
《C++编程思想》的学习笔记主要涵盖了对象的创建与使用,同时也涉及了语言的翻译过程,包括解释器和编译器的工作原理。本章节详细介绍了C++编程的基础知识,包括编译过程、静态类型检查、分段编译工具的使用,以及...
4. **静态与动态绑定**:C++支持静态绑定(编译时绑定)和动态绑定(运行时绑定)。静态绑定发生在编译期间,通常用于非虚函数调用;动态绑定则涉及到虚函数,使得子类可以重写基类的行为。 5. **模板**:模板是C++...
### C++ Primer 笔记知识点概述 ...以上是对C++ Primer笔记中涉及的知识点的详细总结,涵盖了文件类型、预处理器指令、注释、数据类型及内存管理等方面的基础知识,对于初学者来说是非常宝贵的学习资源。
C++是计算机科学中的一种强类型、编译型、静态类型的通用编程语言,由Bjarne Stroustrup在C语言的基础上发展而来,添加了类、模板、命名空间等面向对象特性。C++的学习可以从以下几个方面入手: 1. **基础语法**:...