首页 > 解决方案 > 通过链接链接外部库创建库

问题描述

我正在为我的项目使用 yocto 构建环境。项目中有多个应用程序,其中一些依赖于一个第三方库(它包含*.s0文件、头文件)。所以我打算围绕第三方库创建一个静态包装器库,并为所有应用程序链接包装器库。

项目结构:

.
├── App1
├── App2
├── App3
└── third-party
     └── inc
     └── src
     └── lib
          └── libdvm-hash.so 
          └── libhash-ipc.so
     └── CMakeLists.txt

CMakeLists.txt

project(hash LANGUAGES CXX VERSION "1.0.0")
set(LIBRARY_NAME hash)

set(HASH_LIBRARY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/lib/libdvm-hash.so ${CMAKE_CURRENT_SOURCE_DIR}/lib/libhash-ipc.so 
add_library(${LIBRARY_NAME} STATIC test.cpp)

target_include_directories(${LIBRARY_NAME}
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/inc/>
        $<INSTALL_INTERFACE:include>
)
target_link_libraries(${LIBRARY_NAME} PUBLIC ${HASH_LIBRARY_FILES} ssl)

set_target_properties(${LIBRARY_NAME} PROPERTIES
                        OUTPUT_NAME ${LIBRARY_NAME})

install( FILES
        ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
        ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
        DESTINATION
        ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
install(
    TARGETS ${LIBRARY_NAME}
    EXPORT ${PROJECT_NAME}-targets
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

install(EXPORT ${PROJECT_NAME}-targets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} NAMESPACE dvm::)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/inc/  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT dev)

现在问题在于导出hash-targets.cmake的库路径是硬编码的。

哈希目标.cmake

set_target_properties(hash PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
  INTERFACE_LINK_LIBRARIES "/home/mypc/path/to/the/ibdvm-hash.so;/home/mypc/pathto/the/libhash-ipc.so;ssl"
)

有没有办法修复硬编码路径.*so并使用安装*.so的 from /usr/lib

编辑 我使用(使用bb 文件中的命令)在*.so目标中安装了文件。yoctodo_install_append

标签: cmakebitbake

解决方案


不要使用绝对路径链接,而是为每个此类路径创建一个 IMPORTED 库并与该库链接:

# CMakeLists.txt, building the library

# Create an IMPORTED target which points to the library shipped with the project.
add_library(dvm-hash IMPORTED)
set_target_properties(dvm-hash PROPERTIES
  IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib/libdvm-hash.so
)

# Another IMPORTED target
add_library(hash-ipc IMPORTED)
set_target_properties(hash-ipc PROPERTIES
  IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib/libhash-ipc.so
)

...
# Link with those IMPORTED targets
target_link_libraries(${LIBRARY_NAME} PUBLIC dvm-hash hash-ipc)

这样,当为您的hash库创建导出文件时,CMake 将创建其与目标 dvm-hash的链接和hash-ipc,但不会创建该目标。

下一步是在项目的导出文件中创建这些 IMPORTED 目标。

# hash-config.cmake

# Create an IMPORTED target. That time it points to the library in the target system.
add_library(dvm-hash IMPORTED)
find_library(DVM_HASH_LIBRARY dvm-hash)
set_target_properties(dvm-hash PROPERTIES
  IMPORTED_LOCATION ${DVM_HASH_LIBRARY}
)

# Another IMPORTED target.
add_library(hash-ipc IMPORTED)
find_library(HASH_IPC_LIBRARY hash-ipc)
set_target_properties(hash-ipc PROPERTIES
  IMPORTED_LOCATION ${HASH_IPC_LIBRARY}
)

# Include the export file for the target `hash`
# That file uses IMPORTED targets defined above.
include("${CMAKE_CURRENT_LIST_DIR}/hash-targets.cmake")

推荐阅读