【问题标题】:How does CMake know which prefixes and suffixes to add to shared libraries?CMake 如何知道要添加到共享库中的前缀和后缀?
【发布时间】:2015-09-07 19:37:32
【问题描述】:

我正在尝试在 CMake 中使用 INSTALL 将一些外部二进制文件复制到安装目录。我的代码如下:

SET(SimTK_SHARED_LIBS 
    SimTKsimbody 
    SimTKmath
    SimTKcommon
    SimTKmolmodel
)

INSTALL(TARGETS ${SimTK_SHARED_LIBS} 
   LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
)

我收到此错误:

CMakeLists.txt:216(安装)处的 CMake 错误: 安装 TARGETS 给定的目标“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
)

.. 工作正常。它按应有的方式在${CMAKE_INSTALL_PREFIX}/lib 中安装libMMBlib.so。这是否意味着只有在我发出 ADD_LIBRARY 和/或 SET_TARGET_PROPERTIES 时,INSTALL 才会起作用? SimTK_SHARED_LIBS 是单独编译的,我真的不想在这里编译。

我考虑过使用安装文件,只是编写代码来处理每个操作系统的库名称。但是我相信 CMake 可以轻松优雅地为我完成此任务。

非常感谢

山姆

【问题讨论】:

  • INSTALL(TARGETS) 仅适用于使用 ADD_EXECUTABLE 或 ADD_LIBRARY 创建的 CMake targets。这就是为什么你在第一种情况下会出错。 INSTALL(FILES) 与裸文件相反。首选方法是尽可能使用INSTALL(TARGETS)。至于构建库名称,您可以使用目标的属性。看到那个答案:stackoverflow.com/a/31627913/3440745
  • 好的,但是如果我调用 ADD_LIBRARY,如果找不到它会尝试构建这个库。那是对的吗?此 CMakeLists.txt 没有构建该库的说明。我想这没关系,因为如果库不在它应该在的地方,那么无论如何都应该中止编译。我的理解正确吗?
  • .. 感谢重新格式化!

标签: c++ cmake installation targets


【解决方案1】:

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

CMake 使用CMAKE_SHARED_LIBRARY_PREFIXCMAKE_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} ...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多