gpt4 book ai didi

c++ - 将项目拆分为库和应用程序

转载 作者:搜寻专家 更新时间:2023-10-31 00:19:27 25 4
gpt4 key购买 nike

我正在为我的项目使用 cmake。不,我想将一些部分拆分到一个库中并将其用于 2 个不同的应用程序。

现在我不知道如何在 cmake 中做这个子项目。我的第一次尝试是使用 add_subdirectory 命令:

cmake_minimum_required(VERSION 2.8)

add_subdirectory(MSI)

message("Building MsiQtWizard with: ${MSI_INCLUDE_DIR}")
add_subdirectory(MsiQtWizard)

所以 MSI 就是我的图书馆。 MSI 文件夹内是另一个 cmakelists,它基本上是一个用于构建库的独立列表。我想我可以让 MsiQtWizard 项目也成为一个独立的 cmakelists,所以我理论上可以构建 MSI 并使用该库来构建 MsiQtWizard(和其他项目)。

根目录中的 cmakelists 只是一步构建库和 GUI 的助手。

问题是,为了构建 MsiQtWizard,我需要 msi 和静态库二进制文件的包含路径。我试图在 MIS/CMakelists.txt 的末尾做类似的事情:

### Set variables, other scripts may use ###
SET(MSI_INCLUDE_DIR include)
MESSAGE("Include directory is: ${MSI_INCLUDE_DIR}")

在 MsiQtWizard/CMakelists 中:

##### external libraries #####

#MSI
find_path(MSI_INCLUDE_DIR REQUIRED msi/Image.hpp
PATH_SUFFIXES MSI/include include)

我的意图是,如果之前未设置变量,则 MsiQtWizard 将搜索 msi(以便您可以将此 cmakelists 用作独立的)。构建 MSI 时,我想保存包含路径(以及后来的二进制位置)并将其传递给 MsiQtWizard - 但是一旦我回到我的根 cmakelists,该值就消失了。

这就是我尝试过的。我现在的问题是:我如何正确地将我的项目拆分为一个库和一个(后来的多个)应用程序,我能否以一种我也可以独立构建它们的方式进行拆分?

或者,更具体地说:如何将值从节点 CMakelist 传递到根 CMakeList(就像我尝试使用 MSI_INCLUDE_DIR 一样)?

最佳答案

如果您要构建库 - 最好将其与应用程序构建完全分开。否则,您将使用 cmake 将您的库与您的应用程序耦合起来。 ,在我看来,这违背了建立图书馆的目的。

在构建你的图书馆时,你会想要类似的东西

project (MSILibrary)
ADD_LIBRARY(MSILibrary src/MSI1.cpp src/MSI2.cpp)
install (TARGETS MSILibrary DESTINATION lib)

哪里src包含您的库代码。然后你可以 make然后 sudo make install您的库到您的标准库位置(例如/usr/lib)。

然后您可以在任何后续项目中使用您的库。将这些放在一个新目录中并创建一个新的 CMakeLists.txt为他们。

你会想要这样的东西,

#include find modules
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")

project (MSI-project-1)

find_package(MSILibrary REQUIRED)
IF(MSILibrary_FOUND)
include_directories(${MSILibrary_INCLUDE_DIRS}
ENDIF(MSILibrary_FOUND )


target_link_libraries (MSI-project-1 ${MSILibrary_LIBRARIES})
install (TARGETS MSI-project-1 DESTINATION bin)

现在您需要做的就是帮助 cmake找到你的图书馆。您可以为此包含一个模块。在文件中 ./cmake/Modules/FindMSILibrary.cmake输入如下内容:

# - Try to find MSILibrary library
# Once done, this will define
#
# MSILibrary_FOUND - system has MSILibrary
# MSILibrary_INCLUDE_DIRS - the MSILibrary include directories
# MSILibrary_LIBRARIES - link these to use MSILibrary

## Google this script (I think its fairly standard, but was not bundled with my CMAKE) - it helps find the macros.
include(LibFindMacros)

# Dependencies
libfind_package(MSILibrary)

# Use pkg-config to get hints about paths
libfind_pkg_check_modules(MSILibrary_PKGCONF MSILibrary)

# Include dir
find_path(MSILibrary_INCLUDE_DIR
NAMES MSI.hpp
PATHS ${MSI_Library_PKGCONF_INCLUDE_DIRS}
)

# Finally the library itself
find_library(MSILibrary_LIBRARY
NAMES MSILibrary
PATHS ${MSILibrary_PKGCONF_LIBRARY_DIRS}
)

# Set the include dir variables and the libraries and let libfind_process do the rest.
# NOTE: Singular variables for this library, plural for libraries this this lib depends on.
set(MSILibrary_PROCESS_INCLUDES MSILibrary_INCLUDE_DIR MSILibrary_INCLUDE_DIRS)
set(MSILibrary_PROCESS_LIBS MSILibrary_LIBRARY MSILibrary_LIBRARIES)
libfind_process(MSILibrary)

应该是这样吧。

编辑:

如果你真的想用你的库打包你的应用程序(也许是一些示例应用程序),那么你可以这样做:

在你的根 CMakeLists.txt

cmake_minimum_required (VERSION 2.6)
project (MSIProject)

# The version number.
set (MSIProject_VERSION_MAJOR 0)
set (MSIProject_VERSION_MINOR 1)
set (MSIProject_PATCH_LEVEL 3 )

# project options
OPTION( BUILD_SHARED_LIBS "Set to OFF to build static libraries" ON )
OPTION( BUILD_EXAMPLES "Set to OFF to skip building the examples" ON )

# Put the libaries and binaries that get built into directories at the
# top of the build tree rather than in hard-to-find leaf
# directories.
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)


##########################################################################
# Build the library
##########################################################################

add_subdirectory(MSI-src)

##################
# Build your example Apps if requested
############


IF( BUILD_EXAMPLES )
add_subdirectory(example/MSI-project-1)
add_subdirectory(example/MSI-project-2)
ENDIF( BUILD_EXAMPLES )

您的图书馆 MSI-src/CMakeFiles.txt会和以前一样,你的example/MSI-project-1/CMakeLists.txt会是这样的

## Make the InferData example project
project (MSI-project-1)

#include MSI library
include_directories ("${MSILibrary_SOURCE_DIR}/include")
#include the includes of this project
include_directories ("${MSI-project-1_SOURCE_DIR}/../include")

#build
add_executable(MSI-project-1 src/P1.cpp)
target_link_libraries (MSI-project-1 MSILibrary) #link

install (TARGETS MSI-project-1 DESTINATION bin)

关于c++ - 将项目拆分为库和应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8210451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com