c++ - 使用 CMake 创建库、安装它并链接到另一个项目的正确方法

标签 c++ linker cmake static-libraries

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

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-3Lib3 依赖于 Lib1-2Lib2 依赖于 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 文档几次。

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)

关于c++ - 使用 CMake 创建库、安装它并链接到另一个项目的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27356493/

相关文章:

c++ - std::string 的指针数组

c++ - 静态和共享库链接器错误

gcc - 巧妙使用链接描述文件?

c++ - 带有 CMake 的 QtCreator,在编辑器中错误地解析了 __cplusplus 值

c++ - CMAKE错误: "Cannot open source file" : 'CMakeCCompilerId.c'

c++ - 如何使用 "Modern CMake"设置编译器标志?

唯一元素 vector 的 C++ 模板函数

c++ - 如何正确测试我的后缀表达式是否有效?

c++ - 使用模板参数重载 C++ 方法 : how to make this work for subclass of template?

c++ - Libusb undefined reference