【问题标题】:clarify on CMAKE library installation澄清CMAKE库安装
【发布时间】:2020-08-13 20:22:14
【问题描述】:

奇怪的是,我能看懂 CMAKE 文档,但在稍微复杂一点的场景中,我还是不知道如何使用它。

我想安装一个 SHARED LIB,让其他人使用它。 我知道我可以使用 CMAKE install 命令安装它,但我的第一个问题是我的代码在不安装库的情况下仍然可以工作。该库已构建并放在 cmake_build_debug 目录下。

我所做的只是:

FILE(GLOB SHAREAD_SRC
        ${CMAKE_CURRENT_SOURCE_DIR}/Interface/*.cpp
        )
set(MY_LIB mylib)
add_library(${MY_LIB} SHARED ${SHAREAD_SRC})
add_executable(run_src src/my_src.cpp ${HEADERS})
target_link_libraries(run_src ${MY_LIB})

我现在可以在我的源代码中包含该库的标头并开始使用它。

我的问题是,

  1. 在添加库命令中,我是否还应该包含我的库的头文件?目前我只包含构建库的源文件,因为每当我使用库时,我都知道库头的物理位置(因为我制作了这个库),对于那些也想使用这个库的其他人,我会提供他们是标头和构建的 lib 目标,所以无论他们想把它们放在哪里,都没有问题。

  2. 一些答案​​谈到安装命令说没有包含在 add_library 中的头文件,Why add header files into ADD_LIBRARY/ADD_EXECUTABLE command in CMake,否则您将不会在 IDE 生成的项目中看到头文件。我的标题在这个项目中,所以我不明白这个问题。为什么我需要安装这个库?如果用户下载了我的头文件并拥有构建的二进制文件,安装的目的是什么?

感谢您的帮助!提前感谢。

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:
    1. 除了指定的文件将在 IDE 中“可见”的上述原因之外,还有一个:显式优于隐式(是的 Python 语句)——这意味着你给读者一个提示您的CMakeLists.txt 您的库包含哪些确切文件。是的,使用GLOB 作为来源是众所周知的不好的做法,原因有很多——IRL明确地维护来源列表并不难 strong> 并使您的构建系统不易出错。在某些情况下,您可以获得更多明确提及标头的好处(例如,使用install(TARGET ... PUBLIC_HEADERS ...),但这是另一个主题:)

    2. 您没有指定您的工作流程(如何构建和分发您的项目/库)。然而,install 的主要目标是形成项目的构建映像——即要安装哪些目标/文件/目录以及进入什么目录布局。需要构建依赖于您的其他项目或生成包(w/ CPack)以在某处分发或部署它们。

    另外,要让其他人以 CMake 方式使用您构建的库,请阅读 how to make a package section in the manual。所以,其他人可以直接使用find_package(YourProject) 并使用它(通过target_link_libraries 链接它)——简单易行!

    【讨论】:

    • 您好 Zaufi,感谢您的帮助。 1. 我知道使用 GLOB 可能是不好的做法,但我正在分发库,所以没有人真正通过他们构建项目,他们将看到我构建的二进制文件和我提供的头文件(接口)。这是我的工作流程,希望它能更好地了解让我感到困惑的地方。另外,我问是否在 add_library 中包含头文件,如您所见,我目前只搜索 .cpp 文件,这些头文件包含在这些 .cpp 中,但在构建 lib 时未明确包含。 2. 我希望其他人只下载我的二进制文件和我的头文件。
    • 到目前为止,如果我想使用 cmake 分发我的库,您的回答对我来说是有益的,但我不会这样做。或者除了可以使用 find_package() 还有其他好处吗?
    • 库可以只向我公开头文件,我可以将它们的源放在我的计算机中的任何位置。当我编写我的 makefile 时,我只需要指定我的库位置。所以 cmake 通过使用 install 来混淆。
    • 您可以使用 CPack 为您的库构建一个分发包,为此,您应该使用install()。无论如何,即使您手动构建包,拥有install() 也很好——构建之后,您可以将所需的任何内容预安装到 image 目录 中并以某种方式打包或其他(实际上是 CPack 的工作)。
    • 你如何制作你的分发包?
    猜你喜欢
    • 2018-07-06
    • 2013-11-24
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多