netbeans构建项目也出现了同样的问题。猜测是netbeans内部就用的是-l 这种编译方式,所以需要把***.a手动改为lib***.a

g++ 编译中链接库文件选项有: -L **  -lxxx

其中 -L 告诉编译器哪里去寻找库文件,** 指的是库文件所在路径,xxx 是库文件的名称,那么-lxxx 告诉编译器去找库文件libxxx.a(而不是xxx.a)。

如果生成的库文件时bplus.a ,就需要将其重命名为libbplus.a 这样才会找到该文件。否则,报如下错误

/usr/bin/ld: cannot find -lbplus
collect2: ld returned 1 exit status

PS 

1、linux库文件分为静态库和动态库两种。静态库习惯以.a 结尾,而动态库习惯以.so(shared
object)结尾。而且必须以lib开头。

2、静态库的原则是“以空间换时间”,增加程序体积,减少运行时间;

生成:在编译时候,先生成目标文件.o,然后用ar文件对目标文件归档,生成静态库文件。

例如:ar -rc libtest.a myalib.o (注意:ar -rc 目标
.o文件名),目标一定要以lib开头。

3、使用时候,在链接时候,加上选项 -l 后接库文件名,注意:必须是文件名去掉后缀和lib,
如:gcc -o main main.o -ltest
。而且-ltest必须放在main.o的后面,(规则是,越底层的库越要放在后面)。

4、gcc的其他常用的选项,

-c 编译成目标文件 如:gcc -c main.c 就是编译main.c成目标文件main.o

-I 头文件的查找路径,如:gcc -c main.c -I./inc
意思是:头文件的查找路径除了默认的之外,再加上./inc目录下的。

-L 库文件的查找路径,如:gcc -o main main.o -L./lib -ltest 说明:libtest.a 或者
libtest.so 库文件的查找路径除了默认之外,再加上./lib目录。

-MM 导出文件的依赖关系(用#include 中的内容)如:gcc -MM
main.c找出main.c的所依赖的头文件

-o 生成最终目标

-D宏定义 相当于在C中些语句#define ... 如:-DPI=3.14 就相当于在文件里面写语句#define PI
3.14

5、动态库

(1)、生成:在链接时,用如下选项:-shared -fpic 如: gcc -fpic -shared -o
libtest.so myalib.c

(2)、使用:有隐式使用和显示使用,隐式使用就是共享方式,程序一开始运行就调进去。在链接时候用如下:
gcc -o main main.o -L./lib -ltest(像静态库的一样)

显示使用就是在程序中用语句把动态库调进来,用系统调用:dlopen、dlsym、dlerror、dlclose函数,那样在编译链接时候,不用加上:-L./lib
-ltest了。不过要使用dl*系列函数在编译链接时要加上 -ldl

6、如果同一目录下,既有静态库也有动态库,比如libtest.a
libtest.so都存在,那么dl程序(等一下介绍)就把动态库调进去,没有动态的,就找静态的。再没有,就报错。

7、动态库的搜索路径

dl对动态库的搜索路径如下(按顺序如下)

a.编译目标代码时指定的动态库搜索路径;(如果要指定程序行时在./lib目录下找库文件libtest.so,命令如下:gcc
-o main main.c -L./lib -ltest -Wl,-rpath ./lib)
,其中,-Wl的意思是,后面的选项直接交给ld程序处理,-rpath选项是说更改搜索路径为后面的参数./lib

b.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

c.配置文件/etc/ld.so.conf中指定的动态库搜索路径;(修改完文件后,用ldconfig更新)

d.默认的动态库搜索路径/lib和/usr/lib;

8、一些常用的命令(与库有关的)

(1)、ld 是gcc的链接程序。

(2)、ldd是查看可执行文件中所依赖的库的程序,比如想查main程序用到了那些动态库,可以直接
ldd main

(3)、ldconfig用来更新文件/etc/ld.so.conf的修改生效。

(4)、nm用来查看.so库中的函数名字,标记是T的就是动态库里面生成的名字。如:nm /lib/libc*.so

【转】链接任意目录下库文件(解决错误“/usr/bin/ld: cannot find -lxxx”的更多相关文章

  1. Linux下库文件的设置 (/usr/bin/ld: cannot find -lxxx 的解决办法)

    在软件编译过程中,经常会碰到类似这样的编译错误: /usr/bin/ld: cannot find -lhdf5 这表示找不到库文件 libhdf5.so,若是其它库文件,则是 cannot find ...

  2. Linux系统中提示/usr/bin/ld: cannot find -lxxx错误的通用解决方法

    在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息: 代码如下: /usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的sour ...

  3. ubuntu中解决/usr/bin/ld: cannot find -lxxx

    解决/usr/bin/ld: cannot find -lxxx 在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息:/usr/bin/ld: cannot fin ...

  4. [转载]解决/usr/bin/ld: cannot find -lxxx

    在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息: /usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的source cod ...

  5. 系统中提示未找到/usr/bin/ld: cannot find -lxxx错误的通用解决方法

    在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息: 代码如下: /usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的sour ...

  6. /usr/bin/ld: cannot find -lxxx 的解决办法

    /usr/bin/ld: cannot find -lxxx 的解决办法 在软件编译过程中,经常会碰到类似这样的编译错误: /usr/bin/ld: cannot find -lhdf5 这表示找不到 ...

  7. /usr/bin/ld: cannot find -lxxx 问题 解决方法总结

    最近在做毕设的收尾工作,很多程序都要部署到linux下来运行,遇到了挺多问题,昨天就集中性遇到了 在编译应用时,遇到了 /usr/bin/ld: cannot find -lxxx 这种情况是系统找不 ...

  8. make -f dc_debug.mak 提示错误"/usr/bin/ld:can not find -l***"解决办法

    在公司不同服务器上"make -f ***"程序的时候,有的服务器可以编译通过,有的却提示"/usr/bin/ld:can not find -l***"的错误 ...

  9. 【解决】/usr/bin/ld: cannot find -lc

    现象:运行gcc静态编译程序时报错: /usr/bin/ld: cannot find -lc collect2: ld returned 1 exit statusmake: *** [gcc_dr ...

随机推荐

  1. Git在不同环境换行符设置

    首先我们在eclipse查看两个环境文件的换行符区别: 产生背景 关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别.在计算机还没有出现之前,有一种叫 ...

  2. 关于本地模块安装入maven仓库出现的异常

    Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.9.RELEASE:repackage (de ...

  3. 我的MyGeneration

    话不多说,直接上代码 Interface Code: public class GeneratedGui : DotNetScriptGui { public GeneratedGui(ZeusCon ...

  4. MySQL/InnoDB tips & tricks

    本文讨论的是 MySQL 5.7. 1.混用 * 和列名会产生解析错误,要避免这个错误,要使用 tbl_name.* 的格式. 2.where 子句中不能使用 select 中定义的别名,因为 SQL ...

  5. java代码异常普通的====

    总结:对于各种流类, package com.da; //包括运行异常,和非运行异常 import java.io.*; public class ryl { public static void m ...

  6. java中内部类的讲解

    java中有一个内部类的概念,由于之前一直比较忙,没有单独拿出时间总结一下,今天我就把内部类的相关知识进行一下汇总,如果有不足之处,欢迎批评指正. 1)java内部类的概念.       在一个类的的 ...

  7. 第三章 Java程序优化(待续)

    字符串优化处理 String对象及其特点 String对象是java语言中重要的数据类型,但它并不是Java的基本数据类型.在C语言中,对字符串的处理最通常的做法是使用char数组,但这种方式的弊端是 ...

  8. Linux 正文处理命令及tar vi 编辑器

    root 用户不受权限设置 如果文件有x 就可以执行 对目录的权限 r:可以查看目录下面的文件名 w:可以在该目录下新建,删除,修改文件名 x:可以cd进入目录 对于文件: 可执行的文件来说需要有可读 ...

  9. elasticsearch(4) 安装 (两台)

    环境: centos7  jdk8   elasticsearch1.7.1 安装JDK 确认现有JDK版本 # java –version 安装以及配置环境变量 # tar zxvf jdk-8u6 ...

  10. C#高级参数ref的使用

    ref关键字用于将方法内的变量改变后带出方法外.具体我们通过例子来说明: 例子中,将变量n1和n2交换了.如果没有加ref参数,由于没有swadDemo()方法没有返回值,调用后,n1和n2是不会交换 ...