我无法理解安装的CMake文档。我有一个示例 cmake 文件,其中生成了可执行文件
add_executable(${PROJECT_NAME}_node src/filename.cpp)
然后通过以下命令安装
install(TARGETS ${PROJECT_NAME}_node ${PROJECT_NAME}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )
这个CMake来自ROS,所以catkin就在那里。总体问题保持不变。有人知道,为什么我们需要安装目标/文件?
您必须将文件夹结构视为一个“界面”。然后是三个接口:
每个界面都有不同的文件夹结构,其中包含不同的文件。安装界面就是使用 cmake installing 获得的文件夹结构。本质上,它会获取构建文件夹中的所有相关文件,并创建一个可供其他项目使用的漂亮文件夹结构。
通常,在源外构建(最佳实践)中,您的源接口将是项目根目录的子文件夹,例如
src
或source
。然后,您通常会配置、生成并将 lib 构建到目录 build
,该目录位于 src
旁边,以便您的项目结构如下所示:
源代码和构建接口:
project_root
├── CMakeLists.txt
├── src
│ └── CMakeLists.txt
├── build
│ └── CMakeCache.txt
...
这涵盖了源代码和构建接口。但是安装界面呢?答:安装界面去往用户想要去的任何地方。该位置由 CMAKE_INSTALL_PREFIX 指定。您可以通过指定
--prefix
参数 来覆盖它
cmake --install . --prefix "/where/I/want/it/to/go"
这将根据您在
install()
中声明的 CMakeLists.txt
规则创建安装界面。例如,如果使用使用 GNUInstallDirs
的默认布局(即使对于 Windows 也强烈推荐),这将在 /where/I/want/it/to/go/project_root 下创建一个文件夹结构,如下所示:
安装界面:
project_root
├── bin
│ └── executables
├── sbin
│ └── sysadmin executables
├── lib
│ ├── compiled libraries (*.so (unix) or *.dll (windows))
│ └── library archive files (*.lib (windows))
├── libexec
│ └── executables not directly invoked by user
├── include
│ └── header files
├── doc
│ └── documentation
您可以看到,我们用于开发的几乎所有废话都消失了,我们留下了一个纯粹的目录,其中大部分包含其他应用程序可以使用的预编译内容。如果您的项目依赖于 B 并且您知道它将安装在 Windows 或 Linux 平台上,那么您将使用项目 B 的安装界面。在为仅运行最少操作系统或根本不运行操作系统的嵌入式系统进行开发时,安装界面通常没有多大用处,在这种情况下,您可以使用项目 B 的源界面构建整个应用程序,方法是将其包含在项目中并添加它使用
add_subdirectory()
INSTALL
至少在两种情况下很有用:
您下载一些包的源代码,生成要在系统中使用的二进制文件。例如,您可以在 /usr/bin 下
INSTALL
它们您编译了一些库,您将从另一个产品中使用该库。它将收集所需的文件(头文件、库...),以及这些文件,并将它们放在已知的位置,无论库编译需要它们在哪里。
你可以直接复制它们,但依赖 CMake 可以让流程在更高的层次上表达。
它只是安装在本地系统上构建默认使用的二进制文件。
如果像
bash
或git
这样的工具必须从源安装(例如使用其最新版本),请构建它然后安装它以供使用。
如果本地系统没有所需的工具,或者其包不存在,或者打包的版本是旧的,或者需要一些定制,从源构建和安装(从私有构建目录到公共系统目录)是一种正常的方式。
不需要使用catkin的
INSTALL
功能。
INSTALL 函数只会将最终的
BINARY
、LIBRARY
等复制到更安全的地方(例如位于 /opt/ros/<your-version>/share,lib,include
的主 ros 包空间),以保持构建工作空间不那么拥挤,并在工作空间中保持文件安全已损坏。