cmake中的安装命令是什么?

Ton*_*ker 9 c++ installation cmake ros catkin

我很抱歉我太天真了。我试图从这个 cmake 网站的链接中了解但无法理解。我有一个示例 cmake 文件,其中一个可执行文件是由

add_executable(${PROJECT_NAME}_node src/filename.cpp)

然后通过以下命令安装

安装(TARGETS ${PROJECT_NAME}_node ${PROJECT_NAME}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKIN_BIN_DESTINATION)

这个 cmake 来自 ROS,所以柳絮在那里。总体问题保持不变。有人知道,为什么我们需要安装 TARGETS/FILES?

gla*_*des 8

您必须将文件夹结构视为一个“界面”。然后是三个接口:

\n
    \n
  1. 源接口
  2. \n
  3. 构建接口
  4. \n
  5. 安装界面
  6. \n
\n

每个界面都有不同的文件夹结构,其中包含不同的文件。安装界面就是安装后得到的文件夹结构cmake本质上,它会获取构建文件夹中的所有相关文件,并创建一个可供其他项目使用的漂亮文件夹结构。

\n

通常,在源外构建(最佳实践)中,您的源接口将是项目根目录的子文件夹,例如srcsource。然后,您通常会配置、生成 lib 并将其构建到build紧邻的目录中src目录中,以便您的项目结构如下所示:

\n

源和构建接口

\n
project_root\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CMakeCache.txt\n...\n
Run Code Online (Sandbox Code Playgroud)\n

这涵盖了源代码和构建接口。但是安装界面呢?答:安装界面去往用户想要去的任何地方。该位置由 CMAKE_INSTALL_PREFIX 指定。您可以通过指定来覆盖它--prefix您可以通过指定参数

\n
cmake --install . --prefix "/where/I/want/it/to/go"\n
Run Code Online (Sandbox Code Playgroud)\n

这将根据install()您在CMakeLists.txt. 例如,如果使用默认布局GNUInstallDirs(即使对于 Windows 也强烈推荐),这将在 /where/I/want/it/to/go/project_root 下创建一个文件夹结构,如下所示:

\n

安装界面

\n
project_root\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 executables\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sbin\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sysadmin executables\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 compiled libraries (*.so (unix) or *.dll (windows))\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 library archive files (*.lib (windows))\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libexec\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 executables not directly invoked by user\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 include\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 header files\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 doc\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 documentation\n
Run Code Online (Sandbox Code Playgroud)\n

您可以看到,我们用于开发的几乎所有废话都消失了,我们留下了一个纯粹的目录,其中主要包含其他应用程序可以使用的预编译内容。如果您的项目依赖于 B 并且您知道它将安装在 Windows 或 Linux 平台上,那么您将使用项目 B 的安装界面。在为仅运行最少操作系统或根本不运行操作系统的嵌入式系统进行开发时,安装界面通常没有多大用处,在这种情况下,您可以使用项目 B 的源界面构建整个应用程序,方法是将其包含在项目中并添加它使用add_subdirectory()

\n


小智 -4

不需要使用INSTALLcatkin的功能。

INSTALL 函数只会将您的 FinalBINARY等复制LIBRARY到更安全的地方(例如位于 的主 ros 包空间/opt/ros/<your-version>/share,lib,include),以保持构建工作空间不那么拥挤,并在工作空间损坏时保持文件安全。