- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
CMake 安装采用目标目录,通常使用 GNUInstallDirs 加载目标名称的标准值。例如:
include(GNUInstallDirs)
install(TARGETS Foo
EXPORT Foo
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
但是它不提供针对不同平台或架构构建的不同路径。我一直在通过 CMAKE_INSTALL_PREFIX
安装到我的项目中特定于平台的文件夹,如下所示:
CMAKE_INSTALL_PREFIX=dist/${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}
虽然这有一些问题:
我正在寻找一个与 find_package 模块模式和配置模式一起工作的结构;像这样:
<install_prefix>/
include/
foo/
foo.h
lib/
<PLAT x ARCH x CONFIG>/
cmake/
foo/
FooConfig.cmake
libFoo.a
目标是:
考虑到我会在这里安装大部分第 3 方库,如果这可以通过覆盖 GNUInstallDirs 中的变量来完成,它可能适用于许多库。我想剩下的要么必须编辑,要么我就放弃并使用包括平台和架构的单独安装目录。
最佳答案
我会尽我所能发布,也许它会有用。如果有人遗漏了部分,我会更新。
描述搜索顺序的文档在这里: https://cmake.org/cmake/help/v3.12/command/find_package.html?highlight=%3Cprefix%3E
有很多受支持的排列,所以我将从消除一些开始:
.../cmake/<name>*/
风格。剩下(**添加额外空间以显示相似性):
<prefix>/ (lib/<arch>|lib*|share)/cmake/<name>*/ (U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/ (W/U)
文档指出某些搜索路径适用于某些平台,但从技术上讲,我认为所有搜索路径都已尝试过。这只是平台惯用的问题。但是,因此,您不能使用不同的样式作为平台差异化因素。事实上,这应该意味着 Unix 选项对 Windows 也有效。
正如您在上面看到的,Windows 友好的 Unix 格式的唯一区别是名称的额外前缀。两者都是有效的选择,所以现在我将只引用 Unix only 风格,因为它符合我的偏好。最后,我不太关心“共享”文件夹,因为我们正在谈论 C/C++ 库。
所以最后我们只剩下这两个选择:
<prefix>/lib/<arch>/cmake/<name>*/
<prefix>/lib*/cmake/<name>*/
带有 lib/<arch>
的路径如果 CMAKE_LIBRARY_ARCHITECTURE
被启用变量已设置。 CMAKE_<LANG>_LIBRARY_ARCHITECTURE
状态:
If the
<LANG>
compiler passes to the linker an architecture-specific system library search directory such as<prefix>/lib/<arch>
this variable contains the<arch>
name if/as detected by CMake.
我知道这更专门针对某些支持多体系结构的发行版,并且应该自动设置。但是,我不太清楚这是否可以通过 cmake 轻松利用来实现这里的目标;你会在cmake中设置什么来控制它?在多架构系统上,库 Foo 和 Bar 可能看起来像:
<prefix>/lib/x86_64-linux-gnu/
foo-1.1/
cmake/FooConfig.cmake
bar/
cmake/BarConfig.cmake
foo-1.1.so
foo-1.1.lib
foo-1.1.dll
foo-1.1.dylib
bar.so
bar.lib
bar.dll
bar.dylib
如果我们可以控制 multiarch 的值是什么,这个选项可以很容易地用于其他平台,如:Darwin_x86_64、Windows_x86_64 等。它可能与 find_package 模块模式兼容,在该模式下可以找到所有包含,而不需要配置模式重定向到一些非标准目录。
部分解决方案是在前缀中将平台完全分开,但至少可以将 64 位和 32 位架构组合在一起,只需拆分库即可。
lib*
includes one or more of the valueslib64
,lib32
,libx32
orlib
(searched in that order).
- Paths with lib64 are searched on 64 bit platforms if the
FIND_LIBRARY_USE_LIB64_PATHS
property is set to TRUE.- Paths with lib32 are searched on 32 bit platforms if the
FIND_LIBRARY_USE_LIB32_PATHS
property is set to TRUE.- Paths with libx32 are searched on platforms using the x32 ABI if the
FIND_LIBRARY_USE_LIBX32_PATHS
property is set to TRUE.- The lib path is always searched.
这至少有部分帮助。我会继续将 lib 用作 64 位,然后仅将 lib32 用于 32 位需求。
关于c++ - 对于可重定位的多平台安装,理想的 cmake 安装目录结构是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51112173/
我有以下代码行 #define SCB_VTOR SCB_VTOR_REG(SystemControl_BASE_PTR) #define SCB_VTOR_REG(base)
我已经用 C 语言编写了这个函数(函数应该接收一个 char*,分配必要的空间,并插入字符,给出一个指向指针后面字符索引的指针) void add_to_str(char *character, ch
我正在构建一个 ELF 二进制文件,它需要能够在运行时处理和反转其自身的重定位。 (显然,反转将发生在单独的缓冲区中,而不是原始代码页中。)这样做的目的是内存中的模块内容可以进行 HMAC 运算,并与
我花了很多时间来查找错误原因。下面是我的一段 C++ 程序,它使用 vector 来存储数据。我已经看到,当 vector 增加自身大小时,所有引用都会发生变化。因此,通过 back() 对象保存对
首先,对于我的代码中可能出现的废话,我深表歉意,我还只是个初学者。我正在尝试用 编译这段代码 #include #include #include //initial conditions //#de
基本上,我一直在图像上测试 ImageMapster 插件。但是,我希望每个区域标签的工具提示(或信息面板)彼此相邻。 > http://jsfiddle.net/jagmitg/eQCL6/ 目前,
我正在使用 Devtoolset-7在 CentOS 7 上构建了 Boost 1.65.1 w/它。但是当我链接我的应用程序时,我得到了以下信息: /opt/rh/devtoolset-7/root
我正在 Linux 下编写一个简单的用户空间 ELF 加载程序(为什么?为了“好玩”)。目前我的加载器非常简单,旨在仅加载包含位置无关代码的静态链接 ELF 文件。 通常,当一个程序被内核的 ELF
GWT 将生成一个 gwt-unitCache包含一些缓存文件的目录。经过几天的工作,该目录可能会产生超过 1GB 的缓存文件。我担心生成这些文件可能会损坏我的 SSD 硬盘。 我创建了一个 2GB
假设我正在使用一个 int a vector : vector a {1, 2, 34, 1222, 0}; 然后,我想像这样 push_back 一些数据: a.push_back (data);
我刚刚开始进行嵌入式 arm 开发,有一段代码真的让我很烦恼: /* Initialize the relocate segment */ pSrc = &_etext; pDest = &_srel
所以我有一个 block 在 iPhone 内置加速度计的帮助下移动,另一个 block 随机出现在屏幕上。我正在尝试使用 if 语句来确定移动 block 是否点击或触摸了固定目标 block ,如
我想弄清楚重定位是如何工作的,但我似乎无法理解它。 This document描述了在重定位 ELF 文件时可能遇到的不同类型。 我们以 R_ARM_ALU_SB_G0_NC (#70) 为例。 类型
我正在尝试通过 OS X 中的 __builtin_return_address() 获取返回地址: /* foo.c */ #include void foo() { printf("re
我正在寻找与 Gulp 一起使用的插件链,它提供: 源映射支持 少 缩小 串联 URL 替换( rebase )以解决重定位/连接 我目前有前四个,但我找不到现有插件的组合也能给我最后一个(URL r
我正在编写一些适用于 .o 文件的自定义 ELF 二进制后处理代码。部分处理包括对二进制数据执行重定位。输入文件由 GNU 汇编程序根据我自己的汇编代码生成。 看看 GNU 汇编程序生成的这些疯狂的重
所以我一直在编写 32 位代码,昨天我需要构建一个 dll,但我遇到了一些问题。反正我解决了here . 不幸的是,即使我认为一切正常,但当我将程序和 makefile 移动到其他运行 64 位的计算
在今天下午的华为全场景智慧生活新品发布会上,华为还发布了一款华为儿童手表 4X,在防水和定位性能方面进行了升级。 据介绍,华为儿童手表 4X 采用机甲设计风格,一体化表带,防水升级到 50 米
我正在尝试编译的项目一点也不复杂,除了标准库和一个独立的库(一切都在另一个系统上编译正常)之外,什么都不引用。正如标题所示,它甚至不能链接到标准库中的某些东西,因为那里的东西应该没有用 -fPIC 编
我是一名优秀的程序员,十分优秀!