以技术为主
动态库
C语言调用C++库接口的方法概述
十二 28th
最近需要在由纯c语言编写的代码中调用C++的动态库,在网上找了一些资料,现在总结下解决方法。
主要的思想就是将C++的动态库再封装一层,在这一层编写C语言的函数api,这API中使用C++动态库提供的类;
具体例子如下:
1,假如C++动态库包含如下代码:
//myclass.h
#ifndef _MYCLASS_H #define _MYCLASS_H class MyClass { public: void print(); }; #endif
//myclass.cc
#include <iostream> #include "myclass.h" using namespace std; void MyClass::print() { cout < < "MyClass::print() called" << endl; }
编译链接生成动态库:libmyclass.so
g++ myclass.cc -shared -o libmyclass.so -I./ -fPIC
更多 >
linux gcc 下使用总结【继续更新】
九 29th
入门知识
编译器把编译生成目标代码的任务分为以下4步:
a.预处理,把预处理命令扫描处理完毕;
b.编译,把预处理后的结果编译成汇编或者目标模块;
c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;
d.连接,把多个目标代码模块连接生成一个大的目标模块;
gcc 下常用参数
-I 指定头文件搜索路径,默认情况下gcc的搜索路径/usr/include /usr/local/include
-L 指定库文件的搜索路径,默认的搜索路径为 /lib/ /usr/lib /usr/local/lib ??
-l 指定需要链接的库名称, 注:正常的库libboost_regex.so 使用-lboost_regex 省略前面的lib和后面的扩展名
-c 只生成目标代码 注:生成库文件时使用,只编译不链接
-shared 生成动态库
-o 指定输出文件名称
-W 显示所有的警告信息 注:建议打开
-w 屏蔽所有的警告信息,默认情况
-g 把调试开关打开,让编译的目标文件有调试信息
-S 把源文件编译成汇编代码,不做汇编和连接的动作
-E 只把源文件进行预处理之后的结果输出来。不做编译,汇编,连接的动作
-Xlinker -rpath=./lib 指定程序运行是动态库的搜索路径
-MM 显示出目标文件所依赖的源文件和头文件,头文件仅包括本地头文件
-M 与-MM类似,但是头文件包括系统头文件,即用”<>”
这两个参数在写makefile时用到
实用方法
1, 生成动态库方法
$ gcc -fPIC -c func.c -o func.o
$ gcc -shared -o libfunc.so.1.0.0 func.o
2, 生成静态库方法
$ gcc -c func.c -o func.o
$ ar rcs libfunc.a func.o
3, ldd 命令
查看动态库和可执行文件的依赖的库
4. -MM参数
[yaronli@sim124 cc]$ gcc -MM transfer/Transfer_server.cpp -I. Transfer_server.o: transfer/Transfer_server.cpp transfer/Transfer.h \ transfer/transfer_types.h transfer/TransferStatus.h \ transfer/TransferTasks.h common/TaskIf.h transfer/TransferWorker.h \ common/RingBuffer.h common/TaskIf.h common/FileHandler.h common/log.h \ common/DbOperator.h transfer/Transfer_server.h
问题总结
1, 静态编译时,被依赖库放到依赖库的后面,否则链接时会出错
2, 在生成动态库…………………
linux下动态库的搜索路径顺序及常用命令
九 28th
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib;
5.默认的动态库搜索路径/usr/lib。
注:64位机器自动找lib64库
与动态库相关的命令
1,ldd 查看动态库或者可执行程序依赖的库文件
2,/sbin/ldconfig 在修改/etc/ld.so.conf 后,使用该命令生效ld.so.conf
近期评论