Linux上的CMake: "目标平台不支持动态链接"

24
我有一个非常简单的CMakeLists.txt文件。
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
FIND_PACKAGE(VTK REQUIRED)
PROJECT(test CXX)

这段代码实际上并没有执行任何操作。VTK软件包已经正确地安装在 /usr/lib/vtk-5.8/VTKConfig.cmake 目录下。该文件包含了一些类似于以下语句的声明:

ADD_LIBRARY(foobar SHARED IMPORTED)

为了表明共享库libfoobar.so需要链接到可执行文件中。
但是使用上述脚本创建Makefile时,CMake会抱怨。
CMake Warning (dev) at /usr/lib/vtk-5.8/VTKTargets.cmake:244 (ADD_LIBRARY):
  ADD_LIBRARY called with SHARED option but the target platform does not
  support dynamic linking.  Building a STATIC library instead.  This may lead
  to problems.
Call Stack (most recent call first):
  /usr/lib/vtk-5.8/VTKConfig.cmake:200 (INCLUDE)
  /usr/share/cmake-2.8/Modules/FindVTK.cmake:73 (FIND_PACKAGE)
  CMakeLists.txt:4 (FIND_PACKAGE)
This warning is for project developers.  Use -Wno-dev to suppress it

这个警告的意思是什么,应该如何处理?

这是一个带有CMake 2.8.9的Linux系统。虽然所有包含ADD_LIBRARY(foobar SHARED IMPORTED)的软件包都会出现此错误消息,但这里以VTK-5.8为例。

2个回答

52

PROJECT设置有关平台的一些重要变量。

在为PROJECT设置名称之前不要调用FIND_*模块。


很好的答案,但是在FIND_*命令在工具链文件中的情况下不适用。请参见https://cmake.org/Bug/view.php?id=15999。 - Antonio
这帮了我很多,我正在使用QT,在project之前调用了find_package,我交换了它们的位置,错误就消失了。 - Apeiron

12

当 CMake 全局属性 TARGET_SUPPORTS_SHARED_LIBS 设为 false 并使用共享库时,会出现此错误消息。请参见 CMake 源代码中的 Source/cmAddLibraryCommand.cxx 第 100 行。

除非您在为非常基本的系统(嵌入式 OS)进行交叉编译,否则通常不会出现此错误。

我怀疑这可能是最新版本的 CMake 中的一个 bug 或者您没有正确配置 CMake。


6
确实。由于某种原因,在这台Linux机器上没有设置TARGET_SUPPORTS_SHARED_LIBS。通过明确设置SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE),可以消除警告。 - Nico Schlömer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接