简体   繁体   中英

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

I am trying to use INSTALL in CMake to copy some external binaries to an install directory. My code goes like:

SET(SimTK_SHARED_LIBS 
    SimTKsimbody 
    SimTKmath
    SimTKcommon
    SimTKmolmodel
)

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

I get this error:

CMake Error at CMakeLists.txt:216 (INSTALL): install TARGETS given target "SimTKsimbody" which does not exist in this directory.

this is in spite of putting files called both libSimTKsimbody.so and (incorrectly) SimTKsimbody in the current directory as well as in the library directory.

Interestingly, this:

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
)

.. works fine. It installs libMMBlib.so in ${CMAKE_INSTALL_PREFIX}/lib as it should. Does this mean that INSTALL will only work for this if I issue ADD_LIBRARY and/or SET_TARGET_PROPERTIES? The SimTK_SHARED_LIBS are compiled separately, I really do not want to compile them here.

I have thought about using INSTALL FILES, and just writing code to process the library names for each operating system. However I am convinced that CMake has the means to do this for me easily and elegantly.

Many thanks

Sam

Yes, you should use INSTALL(FILES) for install external libraries files.

CMake uses CMAKE_SHARED_LIBRARY_PREFIX and CMAKE_SHARED_LIBRARY_SUFFIX as default prefix and suffix for libraries created with add_library(... SHARED) , so you may expect these components from external library:

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

Also you may use FIND_LIBRARY for automatic(and nice) check of your expectations about library suffix and prefix:

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

INSTALL(FILES ${SIMTK_SIMBODY_LIB} ...)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM