【关于绿色版fcitx以及动态库版本的问题】

15 views
Skip to first unread message

zcnnbb

unread,
Feb 13, 2012, 5:27:35 AM2/13/12
to fcitx
因为本人要在多出使用fcitx(自己的笔记本、学校机房、系实验室、虚拟机等,而且学校的电脑有系统还原),如果每次都是编译的话会相当麻烦,而如果
有预编译后的通用版则会方便很多。


因为编译fcitx会用到很多dev版本的库,每次都下载的话很麻烦,而且各个发行版的包管理命令都不一样,但运行fcitx的所需库大多数发行版都已
经预装了,基本不需要再装额外包就能使用。因此,提前将fcitx编译好并存到U盘上是个不错的选择。但有两个问题:


(一)
但由此带来的问题的动态库的版本跟路径不一致。
比如,我在自己的电脑上编译,需要连接的动态库是 libXXX.so.3.1,而学校电脑只有libXXX.so.3.0,这个时候程序就无法运
行。
再比如,有些64位发行版的库的路径是/usr/lib,但有些版本是/usr/lib64,在前者系统下编译的程序放到后者就无法运行,因为程序尝试
去/usr/lib寻找动态库。
Linux下解决动态库版本及路径的问题的解决方案是pkgconfig之类的工具,但这个工具只是在编译期起作用,只是负责在编译的时候定位相应动态
库的版本跟路径
有没有在运行期的解决方案?即在程序运行时智能判断动态库版本及路径的工具?

(二)
fcitx程序的路径依赖能不能改成相对路径而非绝对路径?
比如,我在编译时指定的路径是/path1,我将程序mv到/path2,结果运行/path2/bin/fcitx时,它仍然去/path1/
lib/下寻找动态库,能不能使其去/path2/lib/下需找动态库?


这些问题其实也不光是fcitx,而是所有Linux程序通病,请问有没有有效的解决办法?

谢!

zcnnbb

unread,
Feb 13, 2012, 5:49:49 AM2/13/12
to fcitx
简而言之,比如有个软件叫demoapp,依赖包xxx >= 1.0.0,
在编译的时候有cmake、autoconf、pkgconfig等工具,可以自动检测libxxx的版本、动态库位置、头文件位置,如果没装xxx或
者xxx版本过低,则编译失败。
假如符合条件,找到libxxx,其版本为1.0.3,动态库是/usr/lib/libxxx.so.1.0.3,于是cmake运行成功,编译出来
的程序会自动去链接/usr/lib/libxxx.so.1.0.3

但我将这个编译好的程序拷贝到另一个发行版之后,此发行版的动态库位于/usr/lib64,且libxxx的动态库是libxxx.so.1.0,也
就是说,程序需要链接/usr/lib64/libxxx.so.1.0
但这个程序仍然会去找/usr/lib/libxxx.so.1.0.3,结果运行失败。但事实上,这个程序在这个系统下完全可以运行,只不过没有找到
正确的动态库。

请问有没有类似pkgconfig的工具,可以在运行期自动寻找依赖包版本及路径的工具?这样,程序运行之前先调用这个工具,坚持依赖包,如果没找到相
应包或包版本太低则运行失败,如果找到则将路径传给应用程序,程序再加载相应动态库。

XeCycle

unread,
Feb 13, 2012, 5:11:03 PM2/13/12
to fc...@googlegroups.com
zcnnbb <zcn...@gmail.com> writes:

> 因为本人要在多出使用fcitx(自己的笔记本、学校机房、系实验室、虚拟
试试静态链接.

--
Carl Lei (XeCycle)
Department of Physics, Shanghai Jiao Tong University
OpenPGP public key: 7795E591
Fingerprint: 1FB6 7F1F D45D F681 C845 27F7 8D71 8EC4 7795 E591

Z C

unread,
Feb 13, 2012, 10:20:50 AM2/13/12
to fc...@googlegroups.com
使用cmake或autoconf时,加什么参数可以指定静态链接?(只静态链接处gcc、x11之外的库)


2012/2/14 XeCycle <xec...@gmail.com>

Weng Xuetian

unread,
Feb 13, 2012, 2:16:29 PM2/13/12
to fc...@googlegroups.com
在 2012年2月13日 星期一 02:27:35,zcnnbb 写道:
> 因为本人要在多出使用fcitx(自己的笔记本、学校机房、系实验室、虚拟机等,而且学校的电脑有系统还原),如果每次都是编译的话会相当麻烦,而如果
> 有预编译后的通用版则会方便很多。
>
>
> 因为编译fcitx会用到很多dev版本的库,每次都下载的话很麻烦,而且各个发行版的包管理命令都不一样,但运行fcitx的所需库大多数发行版都已
> 经预装了,基本不需要再装额外包就能使用。因此,提前将fcitx编译好并存到U盘上是个不错的选择。但有两个问题:
>
>
> (一)
> 但由此带来的问题的动态库的版本跟路径不一致。
> 比如,我在自己的电脑上编译,需要连接的动态库是 libXXX.so.3.1,而学校电脑只有libXXX.so.3.0,这个时候程序就无法运
> 行。
> 再比如,有些64位发行版的库的路径是/usr/lib,但有些版本是/usr/lib64,在前者系统下编译的程序放到后者就无法运行,因为程序尝试
> 去/usr/lib寻找动态库。
> Linux下解决动态库版本及路径的问题的解决方案是pkgconfig之类的工具,但这个工具只是在编译期起作用,只是负责在编译的时候定位相应动态
> 库的版本跟路径
> 有没有在运行期的解决方案?即在程序运行时智能判断动态库版本及路径的工具?
>
LD_LIBRARY_PATH

>
>
> (二)
> fcitx程序的路径依赖能不能改成相对路径而非绝对路径?
> 比如,我在编译时指定的路径是/path1,我将程序mv到/path2,结果运行/path2/bin/fcitx时,它仍然去/path1/
> lib/下寻找动态库,能不能使其去/path2/lib/下需找动态库?
>
>
抓git 的fcitx来。可以设置 FCITXDIR 这个环境变量。

有兴趣的人可以试试 http://uploads.csslayer.info/uploads/fcitx_portable.tar.gz ,解压后在第一层目
录执行那个脚本,64位的,我不保证能用。不过arch和chakra大概可以吧(因为我从chakra编译的)。

signature.asc

Weng Xuetian

unread,
Feb 13, 2012, 2:19:43 PM2/13/12
to fc...@googlegroups.com
在 2012年2月13日 星期一 02:27:35,zcnnbb 写道:
有root权限的话最好装发行版提供的包。
signature.asc

Ma Xiaojun

unread,
Feb 14, 2012, 8:39:50 AM2/14/12
to fc...@googlegroups.com
> 有root权限的话最好装发行版提供的包。

一般學校的機房/實驗室,是不會有root權限的。這應該是UNIX傳統的使用方式來的,少量主機,多人共享,一般的學生老師不會是root。

我之前也提過類似樓主的需求,但是沒有研究下去……

不過說一些可能對樓主有用的(也可能是廢話LOL)

ldd(1)可以用來看程序依賴的庫
http://linux.die.net/man/1/ldd

LSB規定了部分庫是一定的存在的(不對請指正)
http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/baselib.html

除了靜態編譯外,是否可以自帶整個依賴樹的so文件,我覺得這也是一種方式。

Weng Xuetian

unread,
Feb 14, 2012, 8:46:43 AM2/14/12
to fc...@googlegroups.com
2012/2/14 Ma Xiaojun <damag...@gmail.com>:
这么些讨论的,话说就没人试过我之前发的那玩意吗……

Ma Xiaojun

unread,
Feb 14, 2012, 9:00:04 AM2/14/12
to fc...@googlegroups.com
> 这么些讨论的,话说就没人试过我之前发的那玩意吗……

I'm trying fcitx-portable on CentOS 5.5 x86-64.
It does not work out-of-the-box.
I will give feedback later.

Weng Xuetian

unread,
Feb 14, 2012, 10:19:51 AM2/14/12
to fc...@googlegroups.com
嗯……命令有问题,应该是 lib/ld-linux-x86-64.so.2 bin/fcitx

不过接下来是我用的glibc太新配不上 CentOS 的内核了。(我用的libc要求2.6.27以上内核这样……)

得重新编一个。

http://uploads.csslayer.info/uploads/fcitx_portable.tar.bz2

有兴趣的人试试这个。
2012/2/14 Ma Xiaojun <damag...@gmail.com>:

Weng Xuetian

unread,
Feb 14, 2012, 10:55:49 AM2/14/12
to fc...@googlegroups.com
又更新了一下,改用 light-ui 了,classic-ui 在我那里字体有问题。

在CentOS上编译,已经用我的chakra运行没问题了。

2012/2/14 Weng Xuetian <wen...@gmail.com>:

Ma Xiaojun

unread,
Feb 17, 2012, 12:03:37 AM2/17/12
to fc...@googlegroups.com
這段是fcitx-portable打的,當前啟動腳本,只能用./fcitx,不能在其他目錄調用。小小patch一下。

--- fcitx.orig 2012-02-17 12:47:13.000000000 +0800
+++ fcitx 2012-02-17 12:50:29.000000000 +0800
@@ -1,6 +1,6 @@
#!/bin/sh

-export FCITXDIR=`pwd`
+export FCITXDIR=`dirname $0`
export PANGO_RC_FILE="$FCITXDIR/pangorc"
export PANGO_MODULES_FILE="$FCITXDIR/pango.modules"

Aron Xu

unread,
Feb 17, 2012, 5:41:58 AM2/17/12
to fc...@googlegroups.com
2012/2/14 Weng Xuetian <wen...@gmail.com>:

> 又更新了一下,改用 light-ui 了,classic-ui 在我那里字体有问题。
>
> 在CentOS上编译,已经用我的chakra运行没问题了。
>

给个 build instruction 吧。


--
Regards,
Aron Xu

Z C

unread,
Feb 18, 2012, 2:37:22 AM2/18/12
to fc...@googlegroups.com


2012/2/17 Aron Xu <aronm...@gmail.com>

--
您收到此邮件是因为您订阅了 Google 网上论坛的“fcitx”论坛。
要向此网上论坛发帖,请发送电子邮件至 fc...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 fcitx+un...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/fcitx?hl=zh-CN 访问此网上论坛。


fcitx最好做一个静态链接版本,除glibc、qt、gtk、x之外的所以库都静态链接,这样好移植

Weng Xuetian

unread,
Feb 18, 2012, 3:01:39 AM2/18/12
to fc...@googlegroups.com
不一定要选择静态链接。你看过那个压缩包的里面的东西了吗。
signature.asc

Ma Xiaojun

unread,
Feb 18, 2012, 3:30:30 AM2/18/12
to fc...@googlegroups.com
大家都忽略了我說的腳本問題⋯⋯

Weng Xuetian

unread,
Feb 21, 2012, 1:29:43 AM2/21/12
to fc...@googlegroups.com
2012/2/18 Ma Xiaojun <damag...@gmail.com>:
> 大家都忽略了我說的腳本問題⋯⋯
>
$0 是靠不住的……

Ref:
http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in

另外放在我网站上的怎么想都不是正经发布。no warranty, no future update :)

Ma Xiaojun

unread,
Feb 21, 2012, 3:53:41 AM2/21/12
to fc...@googlegroups.com
> $0 是靠不住的……

其實我也看了你那個ref,給一個dirname $0的Fail Case?否則再多口水也枉然。
在bash方面我是菜鳥,歡迎指教。

Weng Xuetian

unread,
Feb 21, 2012, 9:21:42 AM2/21/12
to fc...@googlegroups.com
2012/2/21 Ma Xiaojun <damag...@gmail.com>:

>> $0 是靠不住的……
>
> 其實我也看了你那個ref,給一個dirname $0的Fail Case?否則再多口水也枉然。
> 在bash方面我是菜鳥,歡迎指教。
>
链接内已说。
例如如果脚本本身被符号链接过。那么你的方法得不到正确结果。

Ma Xiaojun

unread,
Feb 22, 2012, 12:43:53 AM2/22/12
to fc...@googlegroups.com
但是pwd,好像根本就是只支持./fcitx吧~沒實驗,歡迎執政!

Ma Xiaojun

unread,
Feb 22, 2012, 12:48:16 AM2/22/12
to fc...@googlegroups.com
> 但是pwd,好像根本就是只支持./fcitx吧~沒實驗,歡迎執政!

執政=指正⋯⋯

Weng Xuetian

unread,
Feb 22, 2012, 12:50:43 AM2/22/12
to fc...@googlegroups.com
在 2012年2月22日 星期三 13:48:16,Ma Xiaojun 写道:
> > 但是pwd,好像根本就是只支持./fcitx吧~沒實驗,歡迎執政!
>
> 執政=指正⋯⋯
>
所以说我就是弄个出来玩玩告诉大家这有可能而已,你非要对着一个非正式的玩意纠结半天干什么。

简单来说我当初就知道有问题,随便写两下凑合而已,而且我懒得改啦。

signature.asc

Ma Xiaojun

unread,
Feb 22, 2012, 2:30:49 AM2/22/12
to fc...@googlegroups.com
> 所以说我就是弄个出来玩玩告诉大家这有可能而已,你非要对着一个非正式的玩意纠结半天干什么。

因為這對我有用⋯⋯對本帖的樓主也有用⋯⋯至少我改成dirname $0,我可以放在PATH裡用了⋯⋯

Weng Xuetian

unread,
Feb 22, 2012, 10:52:33 PM2/22/12
to fc...@googlegroups.com
2012/2/22 Ma Xiaojun <damag...@gmail.com>:

>> 所以说我就是弄个出来玩玩告诉大家这有可能而已,你非要对着一个非正式的玩意纠结半天干什么。
>
> 因為這對我有用⋯⋯對本帖的樓主也有用⋯⋯至少我改成dirname $0,我可以放在PATH裡用了⋯⋯
>
那你自己改了随便找个网盘说自己改好了好了嘛。
你还能通过搞下git的代码多编译点组件放进去,我已经给libpinyin,sunpinyin和googlepinyin都加了FCITXDIRS的支持
默认配置的话 make DESTDIR=/xxxxx install 外加依赖的库随便搞搞就行。
以后你也不用非要等我来做咯。

以及现在的binary其实都还不太好用的,应该把fcitx的那个脚本放到bin下,把bin的rename成 fcitx.bin
以及对其他的binary都这么做。这样fcitx-configtool到时候也能从界面调用了。

总之再说一次……我不对任何不在google code/github上的东西负责。

Ma Xiaojun

unread,
Feb 22, 2012, 11:00:22 PM2/22/12
to fc...@googlegroups.com
老大,要是我有時閒有能力自己維護一個portable版,我也用不着扯那麽多而不去搞個github/google code……

希望我扯的這些能給其他人一點點啓發,LOL

Reply all
Reply to author
Forward
0 new messages