【发布时间】:2017-05-12 15:10:51
【问题描述】:
我正在使用 Cmake 为我的大学开发一个简单的 C 共享库。 目前我正在开发我的 *.so 和我的 .*h 文件的安装过程。
当用户运行著名的sudo make install 时,我应该把so 和头文件放在哪里?
据我了解:
- 我不应该将它们放在
/usr/lib和/usr/include中,因为这些文件夹是为分发包保留的; - 我不应该将它们放在
/lib和/include中,因为这些文件夹是为操作系统启动包保留的;
剩下的就是usr/local/lib 和/usr/local/include。但是我无法决定是否应该将文件放在子文件夹中:
- 将文件直接放在
usr/local/lib和/usr/local/include中会使它们直接在系统中可用,但与文件夹中的所有其他文件一样,它们将保持无组织状态。更令人不安的事实是,如果有人安装了另一个共享库,其标题与我的名称相同,则可能会发生未知行为; - 将文件放入子文件夹(
/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