0

我想要的是一个基于接口的主库(将来不止一个)。该接口必须由其他库使用,例如 lib1 和 lib2。这个想法是将 lib1 和 lib2 创建为静态的,然后将它们链接到 mainLib,它必须是一个共享库。

对于这个例子,假设我只使用 lib1,因为 lib2 的过程是相同的。

我的问题是我真的不知道如何正确链接库。首先,我需要将接口库与 lib1 链接,因此它成为一个新的静态库,并且这个必须与 mainlib 共享库链接。

我正在尝试制作一个具有以下结构的项目:

mainLib
 |-------> CMakeLists.txt
 |-------> include
 |           |----> mainlib.h
 |-------> src
 |           |----> mainlib.cpp
 |
 |-------> interface
 |           |----> CMakeLists.txt
 |           |----> include
 |                   |----> interface.hpp
 |           |----> src
 |                   |----> interface.cpp
 |           |----> lib1
 |                   |----> CMakeLists.txt
 |                   |----> include
 |                            |----> lib1.hpp
 |                   |----> src
 |                            |----> lib1.cpp
 |           |----> lib2
 |                   |----> CMakeLists.txt
 |                   |----> include
 |                            |----> lib2.hpp
 |                   |----> src
 |                            |----> lib2.cpp

这是我在 cmakelists 中使用的代码版本:

主库

 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/interface ${CMAKE_CURRENT_BINARY_DIR}/interface)
 set(EXPORTABLE_HEADERS include/mainlib.hpp)
 set(SOURCES src/mainlib.cpp)
 set(HEADERS ${EXPORTABLE_HEADERS})
 add_library(${PROJECT_NAME} SHARED ${SOURCES} ${HEADERS} $<TARGET_OBJECTS:lib1>)
 target_include_directories(${PROJECT_NAME}
                           PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
                           INTERFACE $<INSTALL_INTERFACE:include>)
 set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${EXPORTABLE_HEADERS}")
 install(TARGETS ${PROJECT_NAME} EXPORT ${PRODUCT_TARGET}
         ARCHIVE DESTINATION lib
         LIBRARY DESTINATION lib
         RUNTIME DESTINATION bin
         PUBLIC_HEADER DESTINATION include/${PROJECT_NAME}) 
 target_link_libraries(${PROJECT_NAME} lib1)

install(DIRECTORY interface/include/
        DESTINATION "include/${PROJECT_NAME}/interface")

install(DIRECTORY interface/lib1/include/
        DESTINATION "include/${PROJECT_NAME}/interface/lib1")

界面

 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib1 ${CMAKE_CURRENT_BINARY_DIR}/lib1)
 add_library(${PROJECT_NAME} INTERFACE)
 target_include_directories(${PROJECT_NAME} INTERFACE
                        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
                        $<INSTALL_INTERFACE:include>)
install(TARGETS ${PROJECT_NAME} EXPORT ${PRODUCT_TARGET})

库1

set(EXPORTABLE_HEADERS include/lib1.hpp)
set(SOURCES src/lib1.cpp)
set(HEADERS ${EXPORTABLE_HEADERS})
add_library(${PROJECT_NAME} OBJECT ${SOURCES} ${HEADERS})
target_include_directories(${PROJECT_NAME}
                       PUBLIC  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
                               $<INSTALL_INTERFACE:include>
                       PRIVATE $<TARGET_PROPERTY:interface,INTERFACE_INCLUDE_DIRECTORIES>)
install(TARGETS ${PROJECT_NAME} EXPORT ${PRODUCT_TARGET})
target_link_libraries(${PROJECT_NAME} INTERFACE interface)

所以,我需要在定义的 ${PRODUCT_TARGET} 处安装所有标题。但我需要按照项目的相同结构来做。现在,所有的 hpp 都安装在同一个文件夹 (${PRODUCT_TARGET}) 中。

该接口未与我的 lib1 链接,因为它需要一个不在导出集中的目标“接口”,我不知道如何解决它,因为我无法在接口中设置安装属性,因为很多错误。

一旦 lib1 包含接口。我想将它与 mainlib 链接。我只是用它做一个 target_link_libraries,但我不确定这是链接与静态库共享的正确方法。

编辑: 我可以使用此代码生成 de 共享库,但是当我尝试使用它并且包含 lib.hpp 时,它找不到接口的标题。我真的不知道问题出在哪里...

所有建议表示赞赏。

4

0 回答 0