我不是新的C++,虽然我是新的Linux.我正在使用CMake预编译一个带有一些第三方组件的跨平台游戏引擎,但我对使用库有很多疑问.我的问题是如何与第三方图书馆合作,以及把它们放在哪里.Apt在其官方位置安装lib(/usr/local,/usr/lib/)但我在Windows中使用本地lib开发,这些lib位于我的项目目录的一个文件夹中.

此外,我需要一个好的教程来了解图书馆的工作规则.例如:在试图编译我的项目时,luabind要求使用liblua.s0.1,但是AFAIK没有办法用Lua提供的源代码生成这个库(至少做make,make-install).

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

Update:在阅读了一些答案之后,下面是一个更简洁的问题.如果我安装了所有第三方库,我如何分发我的程序?如何在不使用大型自述文件的情况下管理依赖关系?

推荐答案

Where to put libraries

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

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

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

How libraries work

看大卫·A·惠勒的优秀Programming Library HOWTO分.我建议你先阅读这篇文章,然后把任何具体的问题作为新的主题发布出来.

How to distribute your program

传统上,Unix/Linux程序不包含其依赖项的副本.而是由最终用户或开发人员自己安装这些依赖项.正如您所说,这可能需要"大量自述",但它有几个优点:

  • 开发库可以通过发行版的包管理器进行安装、管理和更新,而不是每个源副本都有自己的一组要跟踪的库.
  • 在一个系统上,任何给定库只有一个副本,因此,如果发现安全漏洞,只有一个地方需要更新.(例如,考虑当zlib,一个非常广泛使用的压缩库,发现有security flaw的混乱,因此每个应用程序都包括一个受影响的版本需要更新.)
  • 如果你的程序足够受欢迎(并且是开源的,或者至少是免费的),那么各种Linux发行版的软件包维护人员可能会希望将其打包并包含在他们的发行版中.软件包维护人员不喜欢Bundle 的库.例如,见Fedora's page on the topic.

如果您将程序分发给终端用户,您可能需要考虑提供一个包(.dpkg.rpm),它们可以简单地下载和安装而不必使用源.理想情况下,从最终用户的Angular 来看,软件包将被添加到发行版的存储库(如果它是开源的或至少是免费提供的),这样用户就可以使用他们的软件包管理器(apt-getyum)下载它.这一切都会变得复杂,因为有大量的Linux发行版,但与Debian/Ubuntu兼容的.dpkg和与Red Hat/CentOS/Fedora兼容的.rpm应该能覆盖相当比例的最终用户.构建软件包并不难,网上也有很好的指南.

Linux相关问答推荐

如何注释掉SLURM中的延迟调度命令?

为什么将JAX与Docker一起安装会创建如此大的镜像?

Linux 的 __fastfail 替代方案?

为什么在已连接的设备上调用 btmgmt conn-info 返回:状态 0x02(未连接)

在 Bash 中使用 shell 脚本从文件中解析版本号

x64 NASM 汇编程序在程序开始时显示分段错误

如何在bash中用另一个整数变量增加一个整数变量?

Google Cloud Ops Agent Mongo 集成错误 - AuthenticationFailed:SCRAM 身份验证失败,storedKey 不匹配

如何在linux中将2个不同大小的图像(边框,实际图像)合并为1个

Bash 变量:是否区分大小写?

什么是最有效的不区分大小写的 grep 用法?

更改核心转储的位置

使用 Scp 时防止覆盖文件

你如何在 C 中的 Linux 上进行非阻塞控制台 I/O?

Linux命令删除.git文件夹以外的所有文件?

使用inotify的正确方法是什么?

如何运行我所有的 PHPUnit 测试?

如何获取 GNU Makefile 中使用的 shell 命令的退出状态?

如何使用mv命令移动特定目录中的文件除外?

如何在 docker 容器中运行 cron 作业(job)