【发布时间】:2018-10-04 08:55:33
【问题描述】:
澄清:如果以下设置是一种合理的方法,那么我的问题主要是,当我运行 ninja install 时,如何最好地使用 .lib 添加公共头文件 因为我的解决方案目前不这样做。
有无数关于如何以不同方式做事的例子,其中许多似乎相互矛盾,让我更加困惑。
我正在尝试更改内部构建系统并将其替换为 CMake。代码库由许多不同的组件/库组成,例如操作系统/平台抽象、网络、功能等。在此之前总是作为一个大代码库编译在一起,因此运行 clean 将删除所有内容并重建所有依赖项。
现在说到我无法理解在 CMake 中如何以现代智能方式实现它的部分。
忽略顶部需要依赖链工具这一事实,我的想法是按照库的顺序构建组件/库,而不依赖于最顶层的独立构建运行。 然后每个独立的构建运行将使用其依赖项构建,例如仅用于操作系统抽象库的 windows API,然后在其上运行安装和导出。
- 这是将库编译为 Windows 上的 .lib 或 linux 上的 .a 并将其导出到已知共享位置的一般首选方法吗?
- 我猜这将需要将此库的所有公共头文件复制到同一位置?如果是这样,如何最正确地做到这一点?
如果我有我的操作系统抽象文件夹结构
OSabstraction/
includes/
OSabstraction/
abstraction.h
src/
abstraction.cpp
CMakeLists.txt
我的 CMakeLists 是
cmake_minimum_required(VERSION 3.12)
project(OSabstraction LANGUAGES CXX)
add_library(abstraction)
target_sources(abstraction
PRIVATE
src/abstraction.cpp
)
target_include_directories(abstraction
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes/>
$<INSTALL_INTERFACE:include>
)
install(
TARGETS abstraction
EXPORT abstraction-export
ARCHIVE DESTINATION lib
)
在许多其他内部项目中如何最好地使用这个库?这个库实际上要大很多倍,那么对于大型项目来说,正确的方法是什么?
编辑:我尝试关注Pablo Arias' guide on how to do CMake Right,但我不确定 build_interface 和 install_interface 生成器如何通过导出 .lib 文件来获取我的头文件。
【问题讨论】:
-
这个问题有点宽泛。正如你所拥有的,你将能够构建并安装你的 OSAbstraction 到任何公共位置。您可以通过在调用 CMAKE 时在命令行上设置 CMAKE_INSTALL_PREFIX 变量来做到这一点。然后可以通过设置 CMAKE_PREFIX_PATH 引导其他脚本将此路径用作库/包含搜索路径。然后可以通过
find_package()找到您的预构建库。 -
是的,我知道,问题在于,在我的无知中,似乎有很多方法可以完成这个目标,而且正如我所写的,许多答案似乎相互矛盾。上述解决方案也不适合我。同样,我不确定如何使用给定的示例尽可能正确地导出 .lib 及其标头。或者如果有更好的方法来做到这一点。如果这清除了一些?
-
我认为这真的取决于你想要达到的目标。您是否希望构建一个多库、多平台的 SDK 以供您组织中的其他人使用,或者您是否希望简单地将一个 OSabstraction 库包含到您构建的每个其他可执行文件中?如果是前者,可能是构建 SDK 的 cmake 的 cmake。如果是后者,您可以将抽象作为可执行文件的 git 子模块,也可以使用 externalproject_add 将其构建到每个解决方案的构建目录中。
-
我不知道这是否会回答您的问题,但我会这样做。为每个应该是库的“部分”创建一个 CMakeLists.txt。在该 txt 文件中,将标头公开给调用此 CMakeLists.txt 的任何项目。在您的主项目上,您只需要 add_library 每个子项目,它将构建并将其标题添加到构建系统。最终产品将是您的可执行文件。
-
太宽泛,因为您在问题帖中有太多问题/问题。如果您只是想询问您向我们展示的项目的正确导出,那么只专注于该项目并显示您收到的错误消息。从我立即看到的情况来看,您忘记安装头文件、“abstraction-export”文件和“Config”文件本身(应该包括已安装的“abstraction-export”文件)。
标签: c++ cmake build-system