如何在Ubuntu 16.04中添加静态和动态库?

时间:2017-03-21 19:51:58

标签: ubuntu shared-libraries static-libraries

基本上,我下载了一个用于C / C ++的SDK,我有几个.so和.a文件。 SDK没有安装脚本。它只包含头文件以及.so和.a文件。我真的不知道把这些文件放在哪里。

通常情况下,如果我下载了一些SDK,则会有一个安装脚本为我执行此操作。我没有必须手动执行此操作。我在哪里放这些文件?

2 个答案:

答案 0 :(得分:1)

在Unix和Linux中,通常会遵循以下约定来使用 目录提到: -

  • / usr: - 内容不是系统关键的

  • /usr/bin - 供应商/发行版或安装的可执行文件的根路径 vendor / distro的包管理器

  • /usr/lib - 供应商/发行版或安装的库的根路径 vendor / distro的包管理器

  • /usr/include - 供应商/发行版或安装的头文件的根路径 vendor / distro的包管理器

  • /usr/local/bin - 系统用户安装的可执行文件的根路径 root privelege(),但没有与vendor / distro的包管理器

  • /usr/local/lib - 由安装的库的根路径,但不是 vendor / distro的包管理器

  • /usr/local/include - 由安装的头文件的根路径,但不是 vendor / distro的包管理器

为了系统的稳定性,安装或删除文件非常重要 仅在usr/{bin|lib|include}中使用vendor / distro的包管理器, 您可以信任以了解包的相互依赖性(按版本) 而不是弄乱系统。

另一方面,包管理器将安装usr/local下面的文件 和可以这样做,有root privelege。所以usr/local/{bin|lib|include}是 适合安装可执行文件| libaries |头文件的地方 为您的包裹经理寻找或获得现成但未包装。

这些位置特别适合安装用于构建C或C ++软件的文件,因为: -

usr/local/bin是可执行文件的默认搜索路径。

usr/local/include是头文件的默认编译器搜索路径,所以 如果您的代码包含,例如

#include <foo/bar.h>

并且您已经安装了usr/local/include/foo/bar.h,那么您没有安装-I 需要传递编译器任何usr/local/lib选项以让它找到该标题。

libfoo.a是库的默认链接器搜索路径,所以 如果你的程序需要链接,例如与usr/local/lib/libfoo.a并且你有 已安装-L,然后您没有 需要传递链接器任何-lfoo选项,让它找到该库: libfoo.so就足够了。

但是,如果您放置共享库,例如usr/local/lib中的ldconfig /usr/local/lib (或者就任何地方而言),运行时加载器将无法找到 除非您先刷新其共享库缓存,否则它在运行时。您 需要运行:

checked
在那里放置任何新的共享库之后

不要忘记您安装的任何二进制文件,无法访问源代码, 不会打包在您的供应商/发行版的官方存储库中 包含恶意软件的可能性很高。

答案 1 :(得分:0)

实际上并不重要 - 无论如何,您必须将lib路径传递给编译器。如果你将它们放在应用程序主目录中(源代码在哪里以及你在哪里运行),你就不必放置完整的路径。否则你只会放置绝对路径或相对路径。