我试图使用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} ...)