|
楼主 |
发表于 2007-8-22 07:09:16
|
显示全部楼层
Post by remote fish
...
我的电脑中并不是没有高版本的 freetype,但是从查找顺序上来说,低版本的更优先,所以导致了冲突。这只是一种情况,也许还有别的可能
我觉得吧, 可能是查找顺序有区别, 如LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib. 只不过它们是由系统默认查找的, 当然你也可以改更 LD_LIBRARY_PATH=/lib:/usr/local/lib:/usr/lib 测试一下它, 看是不是这样呢? PATH搜索的路径是/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin, 我猜想, LD_LIBRARY_PATH搜索方式与它类似, 但由于库的几个扫描处是由系统默认的, 默认没有在/etc/profile中更改它.
Post by remote fish
...
比如:1. 把软件需要的运行库放在一个私有的目录下,然后在程序运行时通过指定库路径的方式来寻找我们依赖的库,这可以保证别的程序不会找到我们的库,也不会冲突。但是既然我们的
库不打算给其他的程序用,其意义何在?倒不如直接静态连接或静态编译的好。
....
其它我一直在考虑, 把现在的linux程序路径给更改一下. 这不是从win下带来的习惯, 而是觉得这样组织上会更好些. 如: 建一个专用的目录保存所有的安装程序, 所有的程序安装在此目录时都新建一个以安装程序命名的文件夹来管理, 这就是完全私有化了. 也是的, 这样以后, 它的库就不能被别人使用了, 除非用一些其它的机制, 或是使用LD_LIBRARY_PATH指定(太麻烦了).
我现在就不太喜欢linux程序的组织方式, 我一些自己编译的程序, 我都是放在我自己的目录, 如/opt/mysoftwares, 将一些自己编译的程序和一些可以单独运行的程序, 像qt4, eclipse, mldonkey, doxygen, boost, ace等等, 全部放在下面, 我建一个脚本, 加上需要的参数, 在不同的shell启动脚本上加载. 我觉得这样还不错, 嗯, 但是有一些程序的资源文件需要在/usr/share, /usr/local/share目录下, 如果有一个指定share目录的环境变量的话, 我会把更多的程序给私有化, 再把它的一些目录加入到环境变量中. 如PATH,C_INCLUDE,CPP_INCLUDE, LD_LIBRARY_PATH, SHARE_PATH(假如有). 是现在没有时间, 还有对linux系统编程不太熟悉, 如果熟悉了, 我会给它加上一个这样的变量, 或者直接修改系统, 把组织方式更改一下.
这样更改后, 安装了哪些程序会更直观, 如果包管理器产生一些冲突了(我就有遇到过, 像一些库中的包太旧了, 我自己编译安装它, 但不想要它了, 可是Makefile竟然没有删除的label, 虽然可以手动删除, 但是怕删除错误了), 删除一个程序会更简单些.
静态库和动态库, 如果采用静态编程, 可以把一个执行文件和它的依赖库全编译成一个执行文件(skype, opera类似). 如果使用动态态, 以后更新它的某个库时, 只要它们是API兼容的, 还是可以照样运行. 如果按照我上面的方法更改linux的目录结构的话, 它们的库与头文件与其它程序分享是没有问题的. 但我一直想真正的将所有的程序和它的运行库都独立起来, 除非是系统的东西所有程序就分享, 其它全部私有化, 但不知道怎样会更好, 还是继续考虑或可以的情况下, 做一个快速原形出来.
Post by remote fish
...
要想假如这种直接的冲突,必须要由系统或所有的安装程序达成一个约定,他提供对安装的库的计数。遗憾的是,现在的 linux 没有,也不太可能,提供这种计数,而指望所有的安装程序还维护这样的计数,短期内也是不可能的。
...
这可是一个方法, 或许该加入到包管理器中, 不错的一个想法哦! 我们不求最好, 只求更好. 展开你的想像力去设想怎样才能最好.
别人一直说我们缺少想像力, 研发力不行, 太死板... 这个不是现在谈的重点, 不说它了.
摘一句广告词: "思想有多远, 我们就能走多远!"
我更喜欢将一个应用程序打包成所有linux都可以安装的程序. 我看到有一些打包方法, 如 somefile,bin(它拥有自己的图形化安装方法), somefile.sh(它用脚本在控制, 把安装的二进制文件放在了这个文件中), somefile.package(autopackage打包的安装包).
在linux跨平台安装包中, 我最喜欢autopackage这个包管理器. 它可以与系统本地的包管理器不产生冲突. 如: 有一个用autopackage打包的程序依赖一些库, 它就可以在本系统检测是否有这个库, 如果没有, 可以用本地包管理器安装, 当然也可以使用autopackage安装, 这样autopackage就可以找到它了. 就是说, 它是与本地包协作工作的, 而不是独立的, 这个包管理器有: console安装器, qt界面安装器, gtk界面安装器. 这也是个挺不错的思维! |
|