CMake如何知道将哪些前缀和后缀添加到共享库中?

How does CMake know which prefixes and suffixes to add to shared libraries?

本文关键字:添加 共享 后缀 何知道 前缀 CMake      更新时间:2023-10-16

我试图使用INSTALL在CMake复制一些外部二进制文件到安装目录。我的代码是这样的:

SET(SimTK_SHARED_LIBS 
    SimTKsimbody 
    SimTKmath
    SimTKcommon
    SimTKmolmodel
)
INSTALL(TARGETS ${SimTK_SHARED_LIBS} 
   LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
)

我得到这个错误:

CMake Error at CMakeLists.txt:216 (INSTALL)安装目标给定的目标"SimTKsimbody",它不存在于此目录。

尽管在当前目录和库目录中都放置了名为libSimTKsimbody.so和(不正确的)SimTKsimbody的文件。

有趣的是,这个:

SET(SHARED_MMB_TARGET MMBlib)
ADD_LIBRARY(${SHARED_MMB_TARGET} SHARED
    ${MMB_LIBRARY_SOURCE_FILES}
    ${MMB_HEADER_FILES})
SET_TARGET_PROPERTIES(${SHARED_MMB_TARGET} 
    PROPERTIES
    COMPILE_FLAGS "-DMMB_BUILDING_SHARED_LIBRARY"
    PROJECT_LABEL "MMBlib (dynamic)")
TARGET_LINK_LIBRARIES(${SHARED_MMB_TARGET}
          ${SimTK_SHARED_LIBS_D}
          ${SimTK_SHARED_LIBS}
          ${OpenMM_SHARED_LIBS_D}
          ${OpenMM_SHARED_LIBS}
          ${SimTK_GENERAL_LIBS})
INSTALL(TARGETS ${SHARED_MMB_TARGET}
    LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
)

. .工作很好。它将libMMBlib.so安装在${CMAKE_INSTALL_PREFIX}/lib中。这是否意味着如果我发出ADD_LIBRARY和/或SET_TARGET_PROPERTIES, INSTALL将只适用于此?SimTK_SHARED_LIBS是单独编译的,我真的不想在这里编译它们。

我考虑过使用INSTALL FILES,只编写代码来处理每个操作系统的库名。然而,我相信CMake有办法为我简单而优雅地做到这一点。

多谢山姆

是的,你应该使用INSTALL(FILES)来安装外部库文件。

CMake使用CMAKE_SHARED_LIBRARY_PREFIX和CMAKE_SHARED_LIBRARY_SUFFIX作为add_library(... SHARED)创建的库的默认前缀和后缀,所以你可能会期望这些组件来自外部库:

INSTALL(FILES /path/to/library/${CMAKE_SHARED_LIBRARY_PREFIX}SimTKsimbody${CMAKE_SHARED_LIBRARY_SUFFIX}
    ...)

你也可以使用FIND_LIBRARY来自动(很好地)检查你对库后缀和前缀的期望:

FIND_LIBRARY(SIMTK_SIMBODY_LIB
    ${CMAKE_SHARED_LIBRARY_PREFIX}SimTKsimbody${CMAKE_SHARED_LIBRARY_SUFFIX}
    PATH /path/to/library)
INSTALL(FILES ${SIMTK_SIMBODY_LIB} ...)