【问题标题】:Right way of creating a library, installing it and linking to another project using CMake使用 CMake 创建库、安装库并链接到另一个项目的正确方法
【发布时间】:2014-12-08 10:58:54
【问题描述】:

我有一组文件想要制作成一个库,然后在另一个项目中使用该库。这就是现在的样子

cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
SET(CMAKE_CXX_FLAGS "-std=c++11 -fopenmp -fPIC")
add_library (helperlibs lib1.cpp lib2.cpp lib3.cpp lib4.cpp )
INSTALL(TARGETS helperlibs
        DESTINATION "${HOME}/lib"
        )
INSTALL(FILES lib1.h lib2.h lib3.h lib4.h helperheader.h
        DESTINATION "${HOME}/include/helperlibs"
        )

在此代码中,Lib4 取决于 Lib1-3 和 Lib3 取决于 Lib1-2 和 Lib2 取决于 Lib1。这些 cpp 文件中的每一个还依赖于包含一些定义和结构的 helperheader.h 文件。

在我的项目中,我有以下 CMake 文件

cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
SET( CMAKE_CXX_FLAGS "-std=c++11 -fopenmp -fPIC")
SET(MYINCS ${HOME}/include/helperlibs)
SET(MYLIBDIR ${HOME}/lib)
SET(MYLIBS ${MYLIBDIR}/libhelperlibs.a )
include_directories(${MYINCS})
add_executable(main main.cpp)
target_link_libraries(main ${MYLIBS})

所以我想知道如果你想创建一个静态库并使用 cmake 从另一个项目链接到你应该这样写吗?

【问题讨论】:

  • 您是遇到什么问题,还是只是问问?
  • 我遇到了一些问题,而且有点菜鸟,我不确定这是否取决于我构建库及其依赖项的方式,或者它是否在某个地方的代码中。
  • 不过,您应该发布您遇到的问题。如果我们不知道什么?,我们如何为您提供帮助?
  • 所以我要问的是,如果你想创建一个静态库并使用 cmake 从另一个项目链接到这是你应该编写它的方式,还是我错过了一些关键点。我可以编辑问题以反映这一点。
  • 是的,这是解决此问题的一种方式。但是拜托,如果您需要帮助解决一些问题,请发布这些问题。

标签: c++ linker cmake static-libraries


【解决方案1】:

将搜索路径作为属性嵌入到库目标中并创建导出。 这样,同一构建树中的可执行文件将找到库及其包含文件,而无需指定路径(它们变得隐式)。

我需要仔细阅读 cmake 文档几次,然后才明白它应该如何工作。

http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html#creating-packages http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html

摘自现场示例:

add_library(trustportal-util ${CMAKE_CURRENT_LIST_FILE} ${_source_files} ${_disabled_source_files} )
target_link_libraries(trustportal-util ${Boost_LIBRARIES})
if(APPLE)
    find_library(SECURITY_FRAMEWORK Security)
    target_link_libraries(trustportal-util ${SECURITY_FRAMEWORK})
else()
    find_library(LIB_SSL ssl)
    find_library(LIB_CRYPTO crypto)
    target_link_libraries(trustportal-util ${LIB_SSL} ${LIB_CRYPTO})
endif()

target_compile_definitions(trustportal-util PUBLIC BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)

target_include_directories(trustportal-util PUBLIC ${Boost_INCLUDE_DIRS})
target_include_directories(trustportal-util PRIVATE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)

target_include_directories(trustportal-util SYSTEM PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)

install(TARGETS trustportal-util
    EXPORT trustportal-utilExport
    DESTINATION lib
    INCLUDES DESTINATION include
)
INSTALL(EXPORT trustportal-utilExport DESTINATION lib)

【讨论】:

    【解决方案2】:

    一种选择是做你目前正在做的事情,将包含和库放在一个公共位置,可能是 /usr/include 和 /usr/lib 在 Linux 上,或者 ${HOME} 在 Windows/Linux 上,向上给你。

    如果您使用 git,则可以使用另一个选项。您可以使用子模块将项目包含在另一个项目中。然后使用 include_directory(${submodule}) 并直接为每个项目构建和链接。这种方法的优点是依赖关系更加本地化。这种方法的一个问题是,如果你递归地这样做,你最终可能会得到一些项目的重复,并且 cmake 会抱怨两个库具有相同的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多