CMake错误:TARGETS没有为共享库目标提供LIBRARY DESTINATION

时间:2013-02-20 21:32:36

标签: cmake lemon-graph-library

使用CMake构建一个开源项目时(在我的例子中,它是柠檬图库),当我尝试通过-DBUILD_SHARED_LIBS=1构建共享库时出现此错误:

TARGETS given no LIBRARY DESTINATION for shared library target

此错误来自何处以及如何解决?

4 个答案:

答案 0 :(得分:35)

在我的CMakeLists.txt中,我的INSTALL命令没有LIBRARY参数。

从此改变:

INSTALL(
  TARGETS lemon
  ARCHIVE DESTINATION lib
  COMPONENT library
)

到此:

INSTALL(
  TARGETS lemon
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib  # <-- Add this line
  COMPONENT library
)

解决了我的问题。

答案 1 :(得分:13)

我明白了......发生这种情况的另一个原因是你创建了一个共享库

add_library($ {NAME} SHARED来源)

然后当Cmake在Windows平台上达到安装命令时,它会抱怨这些错误,解决方法是使用RUNTIME而不是LIBRARY,比如

if(WIN32)
  install(TARGETS ${NAME}
    RUNTIME DESTINATION path)
else()
  install(TARGETS ${NAME}
    LIBRARY DESTINATION path)
endif()  

答案 2 :(得分:2)

struct Dummy { int a; double b; }; extern "C" void SetArray(Dummy* x, int cnt); extern "C" void SetArray(Dummy x, int cnt) { // a TODO placeholder. } 之后,它应该具有DESTINATIONbinlib

安装includelib

bin

例如,安装install(TARGETS snappy EXPORT SnappyTargets # RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # DESTINATION error RUNTIME DESTINATION bin ${CMAKE_INSTALL_BINDIR} # should add bin or other dir LIBRARY DESTINATION lib ${CMAKE_INSTALL_LIBDIR} # ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR # DESTINATION error ARCHIVE DESTINATION lib ${CMAKE_INSTALL_LIBDIR} # should add lib ) 文件:

.h

有关更多详细信息,请参见https://cmake.org/cmake/help/v3.0/command/install.html

install(
        FILES
        "${PROJECT_SOURCE_DIR}/test_hard1.h"
        "${PROJECT_BINARY_DIR}/config.h"
        # DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} #  error install FILES given no DESTINATION!

        # add include after DESTINATION, then it works
        DESTINATION include ${CMAKE_INSTALL_INCLUDEDIR}
)

答案 3 :(得分:1)

我刚刚遇到了类似的问题。正如@Fernando在他的回答中所说,您可以采用该解决方案。另一个类似的解决方案是仅include(GNUInstallDirs)

include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME}
    EXPORT "${PROJECT_NAME}Config"
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)