【发布时间】: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