如何使用CMake将链接与静态库链接

时间:2019-02-06 14:28:01

标签: dll cmake shared-libraries static-libraries cmake-modules

我想要的是一个基于接口的主库(将来有多个)。该接口必须由其他lib(例如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中使用的代码的一个版本:

mainLib

 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})

lib1

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,但是我不确定这是正确的方法 与静态库共享链接。

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

感谢所有建议。

0 个答案:

没有答案