Linux下编译动态库,静态库,以及调用
so_test.h:
#include
#include
void test_a();
void test_b();
void test_c();
test_a.c:
#include "so_test.h"
void test_a()
{
printf("this is in test_a...\n");
}
test_b.c:
#include "so_test.h"
void test_b()
{
printf("this is in test_b...\n");
}
test_a.c:
#include "so_test.h"
void test_c()
{
printf("this is in test_c...\n");
}
将这几个文件编译成一个动态库:libtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
test.c:
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
l 将test.c与动态库libtest.so链接生成执行文件test:
$ gcc test.c -L. -ltest -o test
l 测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
$ ldd test
最主要的是GCC命令行的一个选项:
-shared
该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
l
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真
正代码段共享的目的。
l -L.:表示要连接的库在当前目录中
l -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
l LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
最后. 输出库的路径,或者拷贝到/lib目录下
export LD_LIBRARY_PATH=. // 老婆大人告诉俺的
执行 ./test
搞定
静态:
先编译成.o
gcc -c test_a.c test_b.c test_c.c
然后用ar命令
ar -r libtest.a test_a.o test_b.o test_c.o
相关文档:
解决步骤:以arm-linux-gcc-4.3.2.tgz为例
1. 把arm-linux-gcc-4.3.2.tgz拷贝到你指定的目录里,然后用tar命令解压到当前目录。成功后,会在4.3.2/bin下找到arm-linux-gcc。
例如:/opt/arm-linux-gcc-4.3.2.taz,以下命令,红色为系统提示符,黑色为用户命令
gylu@dell-desktop:~$ ......
三个文件,一个头文件,一个读,一个写,用同一个key值申请共享内存。
//shm.h
#ifndef _SHM_COM_H
#define _SHM_COM_H 1
#define TEXT_SZ 2048
struct shared_use_at
{
int written_by_you;
char some_text[TEXT_SZ];
};
struct kts
{
int power;
int mod ......
由于,需要定时备份数据,所以使用 7za来打包。。。 目标文件夹经常含有大量的用户上传图片,这些图片无需高密度定期备份,所以,希望在打包的时候排除它们。。
研究了一下7za的命令行,大致可以这样完成:
7za a '-x!backup/fold/' test.zip backup
&nb ......
1.1 首先下载libnet.tar.gz,heartbeat-2.0.4.tar.gz
1.2 按顺序现装libnet再装heartbeat
都是源码包,解压开后分别执行:
./configure ;make ;make install;
安装完毕。
1.3 软件的配置
Heartbeat软件的安装目录为/usr/local/etc/ha.d,其中的README.config对配置文件进行了说明,共有三个主要的配置
文件:ha.cf, ......