2013-6-15

编译源码时出现:

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<path> 选项指定 run-time path。

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一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。






你可能感兴趣的:(vmware,链接,编译,网络配置,glib)