本文共 815 字,大约阅读时间需要 2 分钟。
g++/gcc 连接 so动态库或者 .a静态库时,需要设置这些动态库的路径, 例如:
g++ -o main main.cpp -L./lib -ldymamic -lpthread -lrt 这些是设置到哪个目录下去查找关联的动态库。 如果在-L目录下面找不到相应的动态库,就会到 LD_LIBRARY_PATH 的目录下去找,如果还找不到,就会到/usr/lib 目录下去找。
而如果要关联静态库,例如: g++ -o main main.cpp -L./lib -ldymamic ./lib/libstatic.a 。 请注意这个静态库的路径。 对于静态库,是需要详细标明这个静态库的路径的, 因为-L后面设置的路径,对于静态库来说是无效的。
现在谈另外一个问题:
g++ -o main main.cpp -L./lib -ldymamic -lpthread -lrt 编译成功后, ./main 运行程序会报错, 提示找不到 libdymamic.so动态库。 因为使用这种方式,需要额外的设置:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib ,之后运行main就可以正常运行了。
当然,你也可以直接这样写:
g++ -o main main.cpp /home/****/libdynamic.so -lpthread -lrt , 直接写动态库的绝对路径。 这样就不需要设置LD_LIBRARY_PATH。 但这样有一个缺陷: 这个so必须放在绝对路径下,不能放到其他地方。 这种写法很不好,不提倡。
动态库搜索路径分两种,一种是链接时候的搜索路径,一种是运行时期的搜索路径。像前面提到的 -L./lib 是属于链接时期的搜索路径,即给ld程序提供的编译链接时候寻找动态库路径;而 LD_LIBRARY_PATH则既属于链接期搜索路径,又属于运行时期的搜索路径。
转载地址:http://glrti.baihongyu.com/