1.通达信公式进阶(9):条件预警和全推数据
2.口袋妖怪跪求金手指的源码源码用法!急!精灵急!蛋获急!源码源码
3.最近有什么好看的精灵**啊
4.理解 pkg-config 工具
通达信公式进阶(9):条件预警和全推数据
全推数据,它指的蛋获cmd无视制作源码是市场实时金融数据,包括最新的源码源码即时量价等基础行情数据,以及基于这些基础数据定义的精灵数据。
通常情况下,蛋获量化交易的源码源码全推数据包括每笔交易、每个tick的精灵实时数据,而通达信的蛋获接口仅提供分时行情级别的全推数据。这里所说的源码源码基础行情全推数据,实际上就是精灵分时行情,而其他全推数据则可以通过DYNAINFO即时行情函数来获取。蛋获
正因为这个特性,通达信的全推数据通常和条件预警功能搭配使用。接下来,我就以我自己编写的公式综合预警示例为例,来教大家如何设置条件预警。
我是@波有蛋,一位从业八年的职业交易员,对股票、基金、程序化交易等领域有深入的研究,擅长指标和选股公式的编写,已经服务了上千粉丝,帮助他们开通了满意的证券账户。
那么,下面我们就正式开始本期的教学吧!
1、全推数据
通达信的全推数据包括即时量价等基础行情数据,以及其他通过DYNAINFO即时行情函数获取的数据。
需要注意的是,直接使用基础行情数据函数OCHLVA获取到的数据并非即时量价全推数据,它还包含了历史行情。即时量价获取接口如下:
对比OCHLVA和即时量价全推数据,基础行情用实线表示,全推数据用虚线表示,将军柱主图公式源码同一个数据用相同的颜色表示,源码如下:
将成交量和成交额放在副图,同比压缩数量级,效果如下图所示:
全推数据始终显示一条直线,始终只输出最新的即时行情数据,而OCHLVA则包含了历史数据。
2、条件预警
条件预警是选股公式的延伸用法。在使用选股公式时,每次选股才生效一次,即便设置自动选股,也只能最多一分钟选一次股(使用一分钟一次刷新非常占用电脑的工作效率)。
条件预警则可以实时处理全推数据,相当于实时刷新的选股公式,只要在盘中随时满足选股条件就能直接将股票加入自选,而使用条件选股则可能错过很多时机。
介绍完条件预警的功能后,我就以我自编的选股公式综合预警示例为例,教大家如何设置条件预警。
首先,导入综合预警示例公式。还没有综合预警示例公式的粉丝,你懂的~
导入成功后,键盘精灵输入.启动条件预警设置。
条件预警设置分成4个栏目,其中预警品种设置、预警公式设置是主要用到的功能。下面我将依次教大家如何设置。
预警品种是指你想对哪些证券进行监控,可以自行选定添加,条件预警默认监控添加的品种。
比如,我想监控所有上证A股,就点击左侧的上证A股栏,再点击全选后确认,即可将所有上证A股添加到监控。
之后,进入预警公式设置,手写qq资料卡源码点击添加公式,选择综合预警示例公式添加。
注意,预警范围可以选择预设品种和指定范围,选择预设品种即监控之前在预警品种添加的列表,选择指定范围则可重新自定义监控范围。
最后,可以将预警结果关联到自定义板块,相当于选股入板块。
设置完成后,系统会提示启动预警功能。
只有盘中才会出现预警结果,示例截图时间在盘后,所以没有数据。
对于不清楚的地方,欢迎留言讨论,任何问题我都会解答~
如果你对低佣开户或量化交易有需求,或者需要量化策略、通达信公式编写的技术支持,关注我,希望能帮得到你。
口袋妖怪跪求金手指的用法!急!急!急!
道具前面是它的源代码,比如 就是有一个(就是)精灵球(就是),从A以后就是道具位置,注意,不要修改得超出道具栏了!
代码—正式名称—用途—中文版翻译名称
光粉 降低对手命中率. (装备) 海子球
自行车 旅行速度X2. 单车
月石 进化一些Pokemon 月石
中毒剂 治愈中毒的Pokemon 解毒
0A 烧伤剂 治愈烧伤的Pokemon 治烧伤
0B 冰冻剂 治愈冰冻的Pokemon 解冻
0C 催醒剂 把睡着的Pokemon叫醒 唤醒
0D 麻痹剂 治愈麻痹的Pokemon 解痹
0E 恢复药 恢复所有HP并治愈异常状态 恢复药
0F 最大补血剂 补满Pokemon的HP 金丹
超级补血剂 回复Pokemon的HP. 银丹
高级补血剂 回复的Pokemon的HP 红丹
补血剂 回复的Pokemon的HP 白丹
逃跑绳 在山洞中逃跑用 大年
除虫剂 走步不会遇到Pokemon 皮皮
完全PP回复 回复一个Pokemon的所有PP 表皮
火石 进化一些Pokemon 火焰石
雷石 进化一些Pokemon 雷之石
水石 进化一些Pokemon 水石
1A HP提升 提升一个Pokemon的HP 比秋
1B 蛋白质 提高Pokemon的攻击 牛磺
1C 铁 提高Pokemon的防守 挨汛
1D 碳水化合物 提高Pokemon的速度 沙波
1E 幸运拳套 提高幸运蛋命中要害的机率 其
1F 钙 提高Pokemon的特攻特防 卡思
神奇糖果 提高Pokemon一级 玛胡
X命中率 战斗中提高命中率 X爱
草石 进化一些Pokemon
金属粉 提高百变怪的防守(装备) 本参
金矿 纯金卖好价钱。 金块
皮皮娃娃 从野生Pokemon逃走 精灵垛
全治愈 治愈所有异常情况 福愈
复活 复活一个Pokemon并回复1/2 HP. 雷胡
精神草 完全复活一个Pokemon
守卫符 防止技能指数受敌人影响 沙事
2A 超级除虫剂 步不遇到Pokemon 拓者
2B 最大除虫剂 步不遇到Pokemon 大皮皮
2C 命中装置 战斗中提高命中要害机率 第雷
2E 新鲜水 回复HP 橙汁
2F 苏打水 回复HP 汁子
柠檬汁 回复HP 椰汁
X攻击 战斗中提高攻击 X击
X防守 战斗中提高防守 X防
X速度 战斗中提高速度 X速
X特殊 战斗中提高特攻特防 X力
硬币盒 可装枚硬币 吉姆
探测器 寻找看不见的物品
EXP分享器 分享经验值(装备) 学习装置
3A 旧钓竿 钓水系Pokemon用 竹杆钩
3B 好钓竿 较好的抓水系Pokemon用的钓竿 木杆钩
3C 银色羽毛 奇怪的银色羽毛 银叶子
3D 超级钓竿 最好钓水系Pokemon用的钓竿 铜杆钩
3E 提高PP 提高一个招式的最大PP
3F 回复PP2 回复一个招式的个PP
完全回复PP2 完全回复一个招式的所有PP 井尖
回复PP3 回复所有招式个PP 尖在
红色鳞片 红色暴鲤龙掉下的鳞片
全能药 治疗好任何Pokemon(剧情道具)
船票 乘船用 船票
神秘的蛋 从精灵爷爷那儿得到的蛋
透明铃铛 捕捉凤凰必带道具 比秋
银翅膀 发亮的银色翅膀 热牛奶
牛奶 回复HP 雪瓜汁
先制之爪 提高速度(装备) 灼灼灼
4A 防毒果实 治愈中毒(装备) 解毒果
4D 金色树叶 奇怪的金色树叶 金叶
4C 软沙子 提高地面系绝招威力(装备) 柔沙
4D 尖利的鸟嘴 提高飞行系绝招威力(装备) 尖啄
4E 防麻果实 治愈麻痹(装备) 解痹
4F 烧过的果实 治愈冰冻(装备) 烧果
冰过的果实 治愈烧伤(装备) 冰果
毒针 提高毒系绝招威力(装备) 仿毒
王者之印 可能惊吓对手(装备) 王印
苦果实 治愈混乱(装备) 苦果
清醒果实 治愈被催眠(装备) 薄果
红栗子 红栗子
小蘑菇 卖不了高价钱
大蘑菇 卖高价
银粉 提高虫系绝招威力(装备) 银粉
蓝栗子 蓝栗子
5B 钱戒指 双倍获得金钱(装备)
5C 黄栗子 黄栗子
5D 绿栗子 绿栗子
5E 避敌丸 装备后就难和Pokemon相遇了 凡票
5F 神秘的水滴 提高水系绝招威力(装备) 神滴
勺子 提高超能系绝招威力(装备) 白栗
白栗子 白栗子
黑腰带 提高格斗系绝招威力(装备) 黑栗
黑栗子 黑栗子
粉红栗子 粉红栗子
墨镜 提高邪恶系绝招威力(装备) 美尾
呆呆兽的尾巴 卖高价 粉带
粉红缎带 提高常规系绝招威力(装备) 长葱
短棍 卖低价 烟弹
6A 烟雾球 从野生Pokemon逃走(装备) 寒冰
6B 千年寒冰 提高冰系绝招威力(装备) 磁石
6C 磁铁 提高电系绝招威力(装备) 奇果
6D 奇迹果 治愈所有异常情况(装备) 小珠
6E 珍珠 卖低价
6F 大珍珠 卖高价
不变石 停止进化(装备) 身符
幽灵标签 提高鬼系绝招威力(装备) 护身符
愤怒湖馒头 回复HP 芝世
济符球 让人不可思议(游戏上是这么显示的) 世革
蓝色的卡 参加电台抽奖用的
奇异种子 提高草系绝招威力(装备) 攻芭
骨头 一种骨头,卖低价 芭凶
毅力缎带 可能防止死(装备) 凶区
能量粉 回复HP
7A 能量根 回复HP
7B 治愈粉 治愈所有异常情况
7C 复活药 复活Pokemon
7D 硬石头 提高岩石系绝招威力(装备) 炙弱
7E 幸运蛋 领取额外的经验值(装备)
7F 卡片钥匙 广播塔百叶窗的钥匙
机器零件 发电场被偷的零件
贸易券 好象是贸易中心用的
掉了的物品 金黄市模仿女孩掉了的娃娃
星尘 红色,卖高价。
星星碎片 卖非常高的价
地下室钥匙 打开门 他砂
车票 乘火车用。 砂仙
8A 木炭 提高火系绝招威力(装备) 贡字
8B 果汁 回复HP.
8C 瞄准镜 提高命中要害机率(装备)
8F 金属外套 提高钢铁类型绝招威力(装备) 顺晨
龙牙 提高龙系绝招威力(装备) 晨或
剩饭 在战斗中回复HP(装备)
神秘果实 回复PP
龙的鳞片 一种珍贵的龙类物品
超梦的遗传因子 提高攻击但会混乱
9C 圣灰 复活所有Pokemon
9E 鲜花邮件 印有鲜花(装备) 晨虎球
A3 心之水滴 提高特攻的奇怪球体(装备) 顺迪
A7 常规箱子 打开看看里面有啥
A8 神秘魔盒 打开看看里面有啥
A9 太阳石 进化一些Pokemon
AA 粉红缎带 提高常规系绝招的威力(装备) 汪及
AC 升级盒 Silph Co.制造的神秘箱子 闪轴
AD 树木果实 一种补血物品(HP,装备)
AE 黄金果实 一种补血物品(HP,装备)
AF 杰尼龟水壶 用来浇树用
B2 彩虹羽毛 彩虹颜色的神秘羽毛 外量
B4 砖型碎片 一种珍贵的碎片 少友
B5 冲浪邮件 邮件上印有乘龙(装备) 友泊
B6 淡蓝色邮件 上面印有迷你龙(装备) 泊宵
B7 肖像邮件 上面印有携带信件精灵 宵欠
B8 可爱邮件 印有心(装备) 欠左
B9 永世邮件 印有伊布(装备) 左电
BA 变形邮件 印有百变怪(装备) 电恨
BB 蓝天邮件 印有蓝天(装备)
BC 音乐邮件 印有超能鸟(装备) 于慢
BD 雾气信件 全则
最近有什么好看的**啊
正在上映:源代码、窃听风云2、赛车总动员2、天潭选股指标源码蓝精灵、哈利波特与死亡圣器、巴黎宝贝、幸福卡片、变形金刚3.
即将上映:美国队长(9.9)、舞力对决(9.8)、全球热恋(9.9)、夺命深渊(9.9)、大武生(9.9)、狂暴飞车(9.)、挪威的森林(9.)、孤胆特工(9.)、紫宅(9.)、辛亥革命(9.)、白蛇传说(9.)、画壁(9.)、永无止境(9,)
理解 pkg-config 工具
你在 Unix 或 Linux 下开发过软件吗?写完一个程序,编译运行完全正常,在你本机上工作得好好的,你放到源代码管理系统中。然后,告诉你的同事说,你可以取下来用了。这时,你长长的出了一口气,几天的工作没有白费,多么清新的空气啊,你开始飘飘然了。“Hi,怎么编译不过去?”你还沉浸在那种美妙的感觉之中,双臂充满着力量,似乎没有什么问题能难倒你的。正在此时,那个笨蛋已经冲着你嚷开了。
“不会吧,我这边好好的!”表面上你说得很客气,其实,通达信软件笑脸源码你心里已经骂开了,真笨,不知道脑子干嘛用的。也许,你想的没错,上次,他犯了一个简单的错误,不是你一去就解决了吗。
他喊三次之后,你不得不放下你手上的工作,刚才那种美妙的感觉已经消失得无影无踪了,要不是你把情绪控制得很好,一肚子气就要撒在他身上了。你走到他的电脑前,键入 make,优雅的按下回车。怎么可能出错呢?你信心十足。然而,屏幕上的结果多少有点让人脸红,该死的,libxxx.so 怎么会让不到呢?
你在/usr目录中查找 libxxx.so,一切都逃不过你的眼睛。奇怪,libxxx.so 怎么在 /usr/local/lib 下,不是应该在 /usr/lib 下的吗?这你可不能怪别人,别人想安装在哪里都行,下次还可能安装到 /lib 目录下呢。
以上的场景并非虚构,我都经历过好几次,明明在本机上好好的,在别人的机器上连编译都过不去。可能两人的操作系统一模一样,需要的库都安装上,只是由于个人 喜好不同,安装在不同的目录而已。遇到这种情况,每次都技巧性的绕过去了,用的补丁型的方法,心里老惦记其它地方能不能工作。
今天我们要介绍的 pkg-config,为解决以上问题提供了一个优美方案。从此,你再也不为此担忧了。pkg-config提供了下面几个功能:
检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
获得编译预处理参数,如宏定义,头文件的位置。
获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
自动加入所依赖的其它库的设置。
这一切都自动的,库文件安装在哪里都没关系!
在使用前,我们说说 pkg-config 的原理,pkg-config 并非精灵,可以凭空得到以上信息。事实上,为了让pkg-config可以得到这些信息,要求库的提供者,提供一个.pc文件。比如gtk+-2.0的pc文件内容如下:
复制代码
代码如下:
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=/usr/include
target=x/ppgtk_binary_version=2.4.0
gtk_host=i-redhat-linux-gnu/ppName: GTK+
Description: GIMP Tool Kit (${ target} target)
Version: 2.6.7
Requires: gdk-${ target}-2.0 atk
Libs: -L${ libdir} -lgtk-${ target}-2.0
Cflags: -I${ includedir}/gtk-2.0
这个文件一般放在 /usr/lib/pkgconfig/ 或者 /usr/local/lib/pkgconfig/ 里,当然也可以放在其它任何地方,如像 X 相关的pc文件是放在 /usr/XR6/lib/pkgconfig 下的。为了让pkgconfig可以找到你的pc文件,你要把pc文件所在的路径,设置在环境变量 PKG_CONFIG_PATH 里。
使用 pkg-config 的 –cflags 参数可以给出在编译时所需要的选项,而 –libs 参数可以给出连接时的选项。例如,假设一个 sample.c 的程序用到了 Glib 库,就可以这样编译:
复制代码
代码如下:
$ gcc -c `pkg-config –cflags glib-2.0` sample.c
然后这样连接:
复制代码
代码如下:
$ gcc sample.o -o sample `pkg-config –libs glib-2.0`
或者上面两步也可以合并为以下一步:
复制代码
代码如下:
$ gcc sample.c -o sample `pkg-config –cflags –libs glib-2.0`
可以看到:由于使用了 pkg-config 工具来获得库的选项,所以不论库安装在什么目录下,都可以使用相同的编译和连接命令,带来了编译和连接界面的统一。
使用 pkg-config 工具提取库的编译和连接参数有两个基本的前提:
库本身在安装的时候必须提供一个相应的 .pc 文件(不这样做的库说明不支持 pkg-config 工具的使用)。
pkg-config 必须知道要到哪里去寻找此 .pc 文件。
GTK+ 及其依赖库支持使用 pkg-config 工具,所以剩下的问题就是如何告诉 pkg-config 到哪里去寻找库对应的 .pc 文件,这也是通过设置搜索路径来解决的。
对于支持 pkg-config 工具的 GTK+ 及其依赖库来说,库的头文件的搜索路径的设置变成了对 .pc 文件搜索路径的设置。.pc 文件的搜索路径是通过环境变量 PKG_CONFIG_PATH 来设置的,pkg-config 将按照设置路径的先后顺序进行搜索,直到找到指定的 .pc 文件为止。
安装完 Glib 后,在 bash 中应该进行如下设置:
复制代码
代码如下:
$ export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH
可以执行下面的命令检查是否 /opt/gtk/lib/pkgconfig 路径已经设置在 PKG_CONFIG_PATH 环境变量中:
复制代码
代码如下:
$ echo $PKG_CONFIG_PATH
这样设置之后,使用 glib 库的其它程序或库在编译的时候 pkg-config 就知道首先要到 /opt/gtk/lib/pkgconfig 这个目录中去寻找 glib-2.0.pc 了(GTK+ 和其它的依赖库的 .pc 文件也将拷贝到这里,也会首先到这里搜索它们对应的 .pc 文件)。之后,通过 pkg-config 就可以把其中库的编译和连接参数提取出来供程序在编译和连接时使用。
另外还需要注意的是:环境变量的设置只对当前的终端窗口有效。如果到了没有进行上述设置的终端窗口中,pkg-config 将找不到新安装的 glib-2.0.pc 文件、从而可能使后面进行的安装(如 glib 之后的 Atk 的安装)无法进行。
在我们采用的安装方案中,由于是使用环境变量对 GTK+ 及其依赖库进行的设置,所以当系统重新启动、或者新开一个终端窗口之后,如果想使用新安装的 GTK+ 库,需要如上面那样重新设置 PKG_CONFIG_PATH 和 LD_LIBRARY_PATH 环境变量。
这种使用 GTK+ 的方法,在使用之前多了一个对库进行设置的过程。虽然显得稍微繁琐了一些,但却是一种最安全的使用 GTK+ 库的方式,不会对系统上已经存在的使用了 GTK+ 库的程序(比如 GNOME 桌面)带来任何冲击。
为了使库的设置变得简单一些,可以把下面的这两句设置保存到一个文件中(比如 set_gtk-2. 文件):
复制代码
代码如下:
export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
之后,就可以用下面的方法进行库的设置了(其中的 source 命令也可以用 . 代替):
复制代码
代码如下:
$ source set_gtk-2.
只有在用新版的 GTK+ 库开发应用程序、或者运行使用了新版 GTK+ 库的程序的时候,才有必要进行上述设置。
如果想避免使用 GTK+ 库之前上述设置的麻烦,可以把上面两个环境变量的设置在系统的配置文件中(如 /etc/profile)或者自己的用户配置文件中(如 ~/.bash_profile) ;库的搜索路径也可以设置在 /etc/ld.so.conf 文件中,等等。这种设置在系统启动时会生效,从而会导致使用 GTK+ 的程序使用新版的 GTK+ 运行库,这有可能会带来一些问题。当然,如果你发现用新版的 GTK+ 代替旧版没有什么问题的话,使用这种设置方式是比较方便的。
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:
在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。
在 /etc/ld.so.conf 文件中添加库的搜索路径。
将自己可能存放库文件的路径都加入到 /etc/ld.so.conf 中是明智的选择。( ^_^)
添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:
复制代码
代码如下:
/usr/XR6/lib
/usr/local/lib
/opt/lib
需要注意的是:第二种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是 因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.cache 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。ldconfig ,简单的说,它的作用就是将 /etc/ld.so.conf 列出的路径下的库文件缓存到/etc/ld.so.cache以供使用。因此当安装完一些库文件(例如刚安装好 glib 或者修改 ld.so.conf 增加新的库路径)后,需要运行一下 /sbin/ldconfig 使所有的库文件都被缓存到 ld.so.cache 中,如果没做,即使库文件明明就在 /usr/lib 下的,也是不会被使用的,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂 computer 蠢猪一个。 (^_^)
在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。
前面已经说明过了,库搜索路径的设置有两种方式:在环境变量 LD_LIBRARY_PATH 中设置以及在 /etc/ld.so.conf 文件中设置。其中,第二种设置方式需要 root 权限,以改变 /etc/ld.so.conf 文件并执行 /sbin/ldconfig 命令。而且,当系统重新启动后,所有的基于 GTK2 的程序在运行时都将使用新安装的 GTK+ 库。不幸的是,由于 GTK+ 版本的改变,这有时会给应用程序带来兼容性的问题,造成某些程序运行不正常。为了避免出现上面的这些情况,在 GTK+ 及其依赖库的安装过程中对于库的搜索路径的设置将采用第一种方式进行。这种设置方式不需要 root 权限,设置也简单:
复制代码
代码如下:
$ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容:
复制代码
代码如下:
$ echo $LD_LIBRARY_PATH
最后,我来总结一下,PKG_CONFIG_PATH 主要指明.pc文件的所在路径,这样 pkg-config 工具就可以根据.pc文件的内容动态生成编译和连接选项,比如 Cflags (编译用)和 Libs (连接用),如果使用的是动态链接库,那么程序在连接和运行时,一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,对于处于默认库搜索路径之外的库,系统管理员可以设置 LD_LIBRARY_PATH 环境变量或在 /etc/ld.so.conf 文件中添加库的搜索路径。值得说明的是,使用 gcc 连接时的选项,如果不用 pkg-config 工具,需要显示的声明连接的动态链接库名。使用 gcc 的同学可以查看下面的注意事项。
Linux 系统中,为了让动态链接库能被系统中其它程序共享,其名字应符合 lib*.so.* 这种格式。如果某个动态链接库不符合此格式,则 Linux 的动态链接库自动装入程序(ld)将搜索不到此链接库,其它程序也无法共享之。格式中,第一个*通常表示为简写的库名,第二个*通常表示为该库的版本号。如在我的系统中,基本C动态链接库的名字为 libc.so.6,线程 pthread 动态链接库的名字为 libpthread.so.0 等等。如果没有指定版本号,比如 libmy.so ,这也是符合要求的格式。
gcc 命令几个重要选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号,不用该标志外部程序无法连接。相当于一个可执行文件)。
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-L.:表示要连接的库在当前目录中。
-lmy:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称(libmy.so)。
当然如果有 root 权限的话,可以修改 /etc/ld.so.conf 文件,然后调用 /sbin/ldconfig 来达到同样的目的,不过如果没有 root 权限,那么只能采用输出 LD_LIBRARY_PATH 的方法了。