我不是C ++的新手,尽管我是Linux新手。我正在使用CMake与一些第三方预编译一个跨平台的游戏引擎,但我对使用库有很多疑问。我的问题是如何与第三方图书馆合作。在哪里放这个库。 Apt在他们的官方位置(/ usr / local,/ usr / lib / ..)安装libs,但我使用本地库中的本地库在我的项目目录中开发。
另外,我需要一个很好的教程来了解库的工作原理。例如:当试图编译我的项目时,luabind通过liblua.s0.1提问,但是AFAIK没有办法用lua提供的源生成这个库(至少做make,make install)。
我知道,这个问题很模糊,但我没有足够的经验来更简洁。
更新:阅读sombe答案后,会有一个更简洁的问题如下。如果我安装所有第三方库,我该如何分发我的程序?如何在不使用大型自述文件的情况下管理家属?
感谢所有强文
答案 0 :(得分:54)
放置库的位置
最佳解决方案是使用Linux发行版的打包系统(apt-get
,yum
或类似方法)尽可能从发行版提供的软件包中安装库。
如果发行版的打包库不是最新的版本,或者您需要一些非标准的构建选项,或者您需要一个发行版不提供的库,那么您可以自己构建和安装它。您有两个主要选项来放置库:
/usr/local
(/usr/local/lib
下的图书馆,/usr/local/include
下的图片集)。这可以安装系统范围内的库,这可能是最简单的解决方案,因为您应该能够在不采取任何额外步骤的情况下构建它们。不要直接在/usr
下安装库,因为这会干扰您的发行版的打包系统。LD_LIBRARY_PATH
或ld.so.conf
- 有关详细信息,请参阅链接。图书馆如何运作
见David A. Wheeler出色的Programming Library HOWTO。我建议阅读,然后将任何具体问题作为新主题发布。
如何分发您的计划
传统上,Unix / Linux程序不包含其依赖项的副本。而是由最终用户或开发人员自己安装这些依赖项。如你所说,这可能需要“大型自述文件”,但它有一些优点:
如果您要将程序分发给最终用户,您可能需要考虑提供一个只需下载和安装的软件包(.dpkg
或.rpm
),而无需使用源代码。理想情况下,从最终用户的角度来看,包将被添加到发行版的存储库(如果它是开源的或至少是免费的),以便用户可以使用他们的包管理器(apt-get
或yum
下载它。 )。这可能都变得复杂,因为那里有大量的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)
好的,所以这是基本问题之一,虽然我自己可能不会对此非常清楚,但这里有:
这是基础。
如果您有一些特定的库,可以将它们添加到您自己的项目特定的lib/
和include/
目录中,并将它们分别添加到包含路径和库路径中。
根据您构建项目的方式,可以通过多种方式将这些目录添加到这些路径中。我确信所有这些都涉及LD_PATH ......但我真的不知道CMake所涉及的具体细节。
有点谷歌搜索可以帮助您使用CMake完成上述操作。
希望有所帮助,
JRH
答案 3 :(得分:1)
如果您使用软件包管理器安装库,它们可能最终都会出现在正确的位置。如果不是,您可以通过使用-L <path>
标志提供额外的搜索路径来让编译器搜索。你应该能够将这个额外的标志传递给CMake。
顺便说一句,-I <path>
可用于添加额外的目录来搜索包含文件。