• g++ 编译顺序问题


    转自:https://blog.csdn.net/sunny04/article/details/17913949

    https://cloud.tencent.com/developer/article/1178753

    1.问题

    g++ -lxxx main.cpp   -o main    //报错undefined reference to
    g++  main.cpp -lxxx  -o main    //ok!

     即cpp文件要放到引用的库之前才行。

    【大写L】-L:Add directory dir to the list of directories to be searched for -l.

    【小写l】-l : Search the library named library when linking.

    It makes a difference where in the command you write this option;
        the linker searches and processes libraries and object files in
        the order they are specified. Thus, `foo.o -lz bar.o' searches
        library `z' after file foo.o but before bar.o. If bar.o refers to
        functions in `z', those functions may not be loaded.

    上面一段说的非常清楚, foo.o -lz bar.o这样的编译顺序,从左往右编译,在处理foo.o的时候,会查找右边的-l,能够找到z,然后在处理到bar.o的时候,右边没有依赖的库,如果它依赖了z,那么可能就会有找不到依赖的问题!

    所以上面第一条命令,将库引用放在cpp之前,那么在处理到cpp的重定位时,向右边找就会找不到。。。

    2.总结

    在引用动态库时可以使用-L路径【大写】+-lxxx【小写】这种方式;

    在引用静态库时直接-llibxxx.a【小写l】即可。

    并且二者都要放在最后,,最好都放在最后,“被依赖的库需要放在后头”,引用规则如下:

    g++ ...  obj($?) -l(上层逻辑lib) -l(中间封装lib) -l(基础lib) -l(系统lib)  -o $@
  • 相关阅读:
    hdu2049.java
    java输入输出流小细节
    滚动字幕
    hdu4504java
    HDU2054JAVA
    hdu2058java
    hdu2073递推题
    [转]SELinux管理与配置
    Can't connect to MySQL server on 'XXX' (13)
    CentOS6.5+php5.3听云安装过程
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/16712947.html
Copyright © 2020-2023  润新知