在哪里放置第三方库来设置c ++ linux开发环境?

时间:2010-09-10 15:03:13

标签: c++ linux libraries

我不是C ++的新手,尽管我是Linux新手。我正在使用CMake与一些第三方预编译一个跨平台的游戏引擎,但我对使用库有很多疑问。我的问题是如何与第三方图书馆合作。在哪里放这个库。 Apt在他们的官方位置(/ usr / local,/ usr / lib / ..)安装libs,但我使用本地库中的本地库在我的项目目录中开发。

另外,我需要一个很好的教程来了解库的工作原理。例如:当试图编译我的项目时,luabind通过liblua.s0.1提问,但是AFAIK没有办法用lua提供的源生成这个库(至少做make,make install)。

我知道,这个问题很模糊,但我没有足够的经验来更简洁。

更新:阅读sombe答案后,会有一个更简洁的问题如下。如果我安装所有第三方库,我该如何分发我的程序?如何在不使用大型自述文件的情况下管理家属?

感谢所有强文

4 个答案:

答案 0 :(得分:54)

放置库的位置

最佳解决方案是使用Linux发行版的打包系统(apt-getyum或类似方法)尽可能从发行版提供的软件包中安装库。

如果发行版的打包库不是最新的版本,或者您需要一些非标准的构建选项,或者您需要一个发行版不提供的库,那么您可以自己构建和安装它。您有两个主要选项来放置库:

  • /usr/local/usr/local/lib下的图书馆,/usr/local/include下的图片集)。这可以安装系统范围内的库,这可能是最简单的解决方案,因为您应该能够在不采取任何额外步骤的情况下构建它们。不要直接在/usr下安装库,因为这会干扰您的发行版的打包系统。
  • 在您的项目目录下,就像在Windows下一样。这样做的好处是不需要root访问权限而不进行系统范围的更改,但是您必须更新项目的包含路径和库路径,并且您必须将任何共享库文件放在dynamic linker可以放置的位置找到它们(使用LD_LIBRARY_PATHld.so.conf - 有关详细信息,请参阅链接。

图书馆如何运作

见David A. Wheeler出色的Programming Library HOWTO。我建议阅读,然后将任何具体问题作为新主题发布。

如何分发您的计划

传统上,Unix / Linux程序不包含其依赖项的副本。而是由最终用户或开发人员自己安装这些依赖项。如你所说,这可能需要“大型自述文件”,但它有一些优点:

  • 可以通过发行版的软件包管理器安装,管理和更新开发库,而不是每个源副本都有自己的库集来跟踪。
  • 系统上只有一个给定库的副本,因此只有一个地方需要更新,例如,如果发现安全漏洞。 (例如,考虑当zlib(一种使用非常广泛的压缩库)被发现具有security flaw时产生的混乱,因此需要更新包含受影响版本的每个应用程序。)
  • 如果您的程序足够流行(并且是开源的或至少是免费提供的),那么各种Linux发行版的程序包维护者可能希望打包它并将其包含在它们的发行版中。包维护者真的不喜欢捆绑的库。例如,请参阅Fedora's page on the topic

如果您要将程序分发给最终用户,您可能需要考虑提供一个只需下载和安装的软件包(.dpkg.rpm),而无需使用源代码。理想情况下,从最终用户的角度来看,包将被添加到发行版的存储库(如果它是开源的或至少是免费的),以便用户可以使用他们的包管理器(apt-getyum下载它。 )。这可能都变得复杂,因为那里有大量的Linux发行版,但Debian / Ubuntu兼容的.dpkg和Red Hat / CentOS / Fedora兼容的.rpm应该覆盖很大比例的结束用户。构建软件包并不太难,而且网上有很好的方法。

答案 1 :(得分:2)

关于Windows的问题的第一部分:Windows上的库/标题没有真正的标准位置,因此简单的解决方案是:创建自己的。只需提供一个lib /并在您的系统上包含/,让您的所有项目都使用它(通过设置包含在任何地方的cmake文件中的路径)。将所有第三方库放在那里,例如:

您的项目:

d:/projects/projectA
d:/projects/projectB

第三方的东西:

d:/api/lib/lua.lib
d:/api/include/lua/....

(如果你有不同的版本,你甚至可以使用符号链接'又名'目录连接')

和相应的cmake文件:

include_directories( d:/api/include )
link_directories( d:/api/lib )

答案 2 :(得分:1)

好的,所以这是基本问题之一,虽然我自己可能不会对此非常清楚,但这里有:

  1. 在构建项目时,编译器需要查找库的头文件。标头必须位于包含路径中。
  2. 编译完成后,链接器将查找库二进制文件(files.so或类似的东西)。这些必须位于库路径中。
  3. 这是基础。

    如果您有一些特定的库,可以将它们添加到您自己的项目特定的lib/include/目录中,并将它们分别添加到包含路径和库路径中。

    根据您构建项目的方式,可以通过多种方式将这些目录添加到这些路径中。我确信所有这些都涉及LD_PATH ......但我真的不知道CMake所涉及的具体细节。

    有点谷歌搜索可以帮助您使用CMake完成上述操作。

    希望有所帮助,
    JRH

答案 3 :(得分:1)

如果您使用软件包管理器安装库,它们可能最终都会出现在正确的位置。如果不是,您可以通过使用-L <path>标志提供额外的搜索路径来让编译器搜索。你应该能够将这个额外的标志传递给CMake。

顺便说一句,-I <path>可用于添加额外的目录来搜索包含文件。