编译源码时出现:
No such file or directory
...so: undefined reference to ...
可以设置环境变量
export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/lib (当默认位置没有相应库时,告诉连接器在哪里寻找库)
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig (当默认位置没有相应pc文件时,pkg-config到哪里寻找相应的文件:pc文件里有库的版本信息以及依赖依赖其他库的信息)..
--------------------------------------
make时,可以加上V=1参数,能显示编译时实际使用的命令。objdump 可以显示相关文件的信息,如
objdump -T ××.so | grep ×× 寻找某共享库中是否有相关的符号。
------------------------------------------
命令行下设置网络参数:来自这里
若要使用保存版本,可以通过修改文件方式执行:
1. IP地址配置
CentOS的网络配置文件保存在:/etc/sysconfig/network-scripts/ifconfg-*,其中*换成网卡编号,比如eht0, lo。
执行
[root@tigertall ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
内容如下:
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0 #网卡编号
BOOTPROTO=static #静态ip或者DHCP动态获取。 静态--static 动态--dhcp
BROADCAST=192.168.101.255 #广播地址
HWADDR=00:0C:29:90:50:42 #MAC地址
IPADDR=192.168.101.5 #IP地址
NETMASK=255.255.255.0 #子网掩码
NETWORK=192.168.101.0 #网段,我就是开始忘记设置这个了
ONBOOT=yes #开机时是否启动网卡。启动--yes 不启动--no
2. 网关配置
CentOS的网关配置是放在下面这个文件的。
[root@tigertall ~]# vi /etc/sysconfig/network
内容如下:
NETWORKING=yes #网络是否可用 可用--yes, 不可用--no
NETWORKING_IPV6=no #IPv6支持 yes,no
HOSTNAME=tigertall.local.com #主机名称
GATEWAY=192.168.101.2 #网关地址
3. 重启网络服务
service network restart 或者 /etc/init.d/network restart
关闭使用stop参数,启动使用start参数。
[root@tigertall ~]# service network restart
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: [ OK ]
3. 配置DNS
首先,你可以在/etc/hosts中加入一些主机名称和这些主机名称对应的IP地址,这是简单使用本机的静态查询.
要访问DNS 服务器来进行查询,需要设置/etc/resolv.conf文件.
假设DNS服务器的IP地址是192.168.3.2, 那么/etc/resolv.conf文件的内容应为:
search test.com #本机
nameserver 192.168.3.2 #用户添加
据说最多可以添加多行,前三行会生效,没有测试。
/*我设置了DNS,但是没有用。不知是不是在虚拟机里的关系*/
---------------------------------------------------------------
如果出现:Device eth0 does not seem to be present,delaying initialization.
这是因为虚拟机的mac地址变了,系统启动时检测到的网卡由于之前不存在,于是在
/etc/udev/rules.d/70-persistent-net.rules 添加新网卡的信息。
然而由于/etc/sysconfig/network-scripts/ifcfg-eth0
里的网络设置是针对之前的mac地址的,故会出现上述错误。
--------------------------------------------------------------------------
glib2 是个重要的库,参见这里 所以就算升级也不能乱删原来的版本,就如python
删了后,图像相关的界面都无法启动了。连NetworkManager也无法启动。所以要手动配置网络参数。
我设置的是vmware桥接相关的参数(能与主机相连后,用scp把glib2 rpm包传过去,安装后一切正常)。换回NAT链接方式,点击桌面右上角的图标发现有两个配置,以后切换不同网络配置就方便了!
-------------------------------------------------------------------------
linux如何寻找共享库,来自这里
Linux 运行的时候,是如何管理共享库(*.so)的?在 Linux 下面,共享库的寻找和加载是由 /lib/ld.so 实现的。 ld.so 在标准路经(/lib, /usr/lib) 中寻找应用程序用到的共享库。
但是,如果需要用到的共享库在非标准路经,ld.so 怎么找到它呢?
目前,Linux 通用的做法是将非标准路经加入 /etc/ld.so.conf,然后运行 ldconfig 生成 /etc/ld.so.cache。 ld.so 加载共享库的时候,会从 ld.so.cache 查找。
传统上,Linux 的先辈 Unix 还有一个环境变量:LD_LIBRARY_PATH 来处理非标准路经的共享库。ld.so 加载共享库的时候,也会查找这个变量所设置的路经。
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib
export LD_LIBRARY_PATH
但是,有不少声音主张要避免使用 LD_LIBRARY_PATH 变量,尤其是作为全局变量。这些声音是:
* LD_LIBRARY_PATH is not the answer - http://prefetch.net/articles/linkers.badldlibrary.html
* Why LD_LIBRARY_PATH is bad - http://xahlee.org/UnixResource_dir/_/ldpath.html
* LD_LIBRARY_PATH - just say no - http://blogs.sun.com/rie/date/20040710
解决这一问题的另一方法是在编译的时候通过 -R
1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library 会找不到
2. 想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到。
比如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下 面,这时就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的 library才能在程序运行时被找到。
3. 如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变 量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时 候使用。
4. ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。
5. 总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。