- 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/
从许多帖子中我可以读到有关最大池大小的公式,它取决于 CPU 的数量 + 1。这是一个明确的解释。 但是如果应用程序定义了许多执行器或线程池执行器怎么办。然后我们还必须考虑应用程序共享相同的硬件。这对
我一直在寻找垂直 Accordion 内容 slider 。我找到了一个:http://www.marghoobsuleman.com/jQuery-common-accordion ,而且还不错。我
在 not having a whole bunch of luck 之后找到任何可充当 SNMP 代理的 .NET SNMP 库(可在 OSS 项目中使用 - 这意味着专有库已经过时),我现在正在考
目前我正在考虑: VMWare 管理程序 ESXi 中央操作系统 5.5 内存缓存 1.4.5和依赖 这就是全部。我还需要什么/任何替代品吗? 最佳答案 Memcached在linux上运行的很好,所
我是一名优秀的程序员,十分优秀!