【问题标题】:Subfolders in /usr/local/lib?/usr/local/lib 中的子文件夹?
【发布时间】:2017-05-12 15:10:51
【问题描述】:

我正在使用 Cmake 为我的大学开发一个简单的 C 共享库。 目前我正在开发我的 *.so 和我的 .*h 文件的安装过程。

当用户运行著名的sudo make install 时,我应该把so 和头文件放在哪里? 据我了解:

  1. 我不应该将它们放在/usr/lib/usr/include 中,因为这些文件夹是为分发包保留的;
  2. 我不应该将它们放在/lib/include 中,因为这些文件夹是为操作系统启动包保留的;

剩下的就是usr/local/lib/usr/local/include。但是我无法决定是否应该将文件放在子文件夹中:

  1. 将文件直接放在usr/local/lib/usr/local/include 中会使它们直接在系统中可用,但与文件夹中的所有其他文件一样,它们将保持无组织状态。更令人不安的事实是,如果有人安装了另一个共享库,其标题与我的名称相同,则可能会发生未知行为;
  2. 将文件放入子文件夹(/usr/local/lib/myAwesomeProject//usr/local/include/myAwesomeProject)将避免上述行为,但会阻止系统自动检测我的库(据我了解,系统仅在特定情况下自动查找包含和库目录非递归):所以如果系统查看/usr/local/include,由于子文件夹,我的包含将找不到!

为了帮助你,这是我的系统:

  • OS 系统:Ubuntu 16.4(在 Windows 10 64 位上虚拟化 64 位);
  • CPU(不是我认为有用的):Intel® Core™ i5-3230M CPU @ 2.60GHz × 2;

感谢您的友好回复!

【问题讨论】:

  • 为什么不安装在/opt/opt 文件夹用于存放其他软件,这些软件不是通过包管理器或类似的标准方式安装的。然后,您可以在使用该库的项目中使用set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} <dir_in_opt_where_your_lib_is>)。至于安装文件夹的结构 - 这实际上取决于库的结构。特别是对于使用 C++ 模板的库(库实际上在头文件中),没有包含的情况并不少见。
  • 我一直认为“make install”被认为是“标准手段”:我错了吗?至于 CMAKE_MODULE_PATH:我当然可以使用这种方法,但这并没有违背系统自动查找 *.so 和 *.h 的公共目录的目的?
  • 这个问题与 C 和 CMake 无关。甚至可能与编程无关。关于 CMake:安装前缀可以更改,但 /usr/bin 等。是一个明智的默认选择。
  • 1.库和头文件位置的方法可能不同:您应该将 library 直接 放入 /usr/local/lib(否则链接器将无法找到它们),但可以将 头文件放在 @ 的子文件夹下 987654338@(因此它们不会与其他库的标头混合)。 2. 问题本身是基于意见的,因为没有关于安装位置的没有通用规则。作为一种简单但广泛使用的方法,您可以使用来自GNUInstallDirs CMake 模块的安装目录。
  • @Tsyvarev:我认为这个过程非常标准化......我没有意识到这实际上是一个非常有争议的话题。我认为你的评论是目前最清楚的。 +1 还引用了标准:它总是有帮助的。如果您可以将您的评论作为答案,我会+1。 (几天后,如果没有其他方法发布,我会将答案标记为已接受)

标签: c cmake shared-libraries


【解决方案1】:
  1. 库和头文件位置的方法可能不同:您应该将库直接放入/usr/local/lib(否则链接器将无法找到它们)但可以将头文件放在子文件夹下 of /usr/local/include(因此它们不会与其他库的标头混合)。
  2. 问题本身是基于意见的,因为没有关于安装位置的通用规则。作为一种简单但广泛使用的方法,您可以使用来自 GNUInstallDirs CMake 模块的安装目录。

– Tsyvarev

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2013-07-27
    • 2014-10-01
    • 2018-07-25
    • 2020-04-12
    • 2018-09-17
    相关资源
    最近更新 更多