Proper way to link a static library using GCC

后端 未结 4 784
逝去的感伤
逝去的感伤 2020-12-24 13:56

Why is it that some static libraries (lib*.a) can be linked in the same way that shared libraries (lib*.so) are linked (ld -l switch), but some can not?

I had always

相关标签:
4条回答
  • 2020-12-24 14:41

    The correct way to link a static library is using -l, but that only works if the library can be found on the search path. If it's not then you can add the directory to the list using -L or name the file by name, as you say.

    The same is true for shared libraries, actually, although they're more likely to be found, perhaps.

    0 讨论(0)
  • 2020-12-24 14:42

    Thanks for the replies! Turns out the problem was due to link order. Apparently, if you use a library which in turn has other library dependencies, those other dependencies must be listed after the library, not before as I had been doing. Learned something new!

    0 讨论(0)
  • 2020-12-24 14:59

    Have you cared to indicate to GCC the path of your library (using -L) ? By using -l solely, GCC will only be able to link libraries available in standard directories.

    -L[path] -l[lib]
    
    0 讨论(0)
  • 2020-12-24 14:59

    The reason is historical. The "ar" tool was original the file archive tool on PDP11 unix, though it was later replaced entirely by "tar" for that purpose. It stores files (object files, in this case) in a package. And there's a separate extension containing the symbol table for the linker to use. It's possible if you are manually managing files in the archive that the symbol table can get out of date.

    The short answer is that you can use the "ranlib" tool on any archive to recreate the symbol table. Try that. More broadly, try to figure out where the corrupt libraries are coming from and fix that.

    0 讨论(0)
提交回复
热议问题