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

Nic*_*mer 12 cmake dynamic-linking static-linking

我很简单 CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
FIND_PACKAGE(VTK REQUIRED)
PROJECT(test CXX)
Run Code Online (Sandbox Code Playgroud)

那真的什么都没做.正确找到VTK包/usr/lib/vtk-5.8/VTKConfig.cmake.该文件包含许多类型的语句

ADD_LIBRARY(foobar SHARED IMPORTED)
Run Code Online (Sandbox Code Playgroud)

表示共享库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
Run Code Online (Sandbox Code Playgroud)

这个警告意味着什么,它是如何处理的?

这是一个使用CMake 2.8.9的Linux系统.虽然对于包含的所有软件包都会显示此错误消息ADD_LIBRARY(foobar SHARED IMPORTED),但此处将使用VTK-5.8作为示例.

小智 28

PROJECT设置了关于plarform的一些重要变量.

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


Sil*_*ker 7

当CMake全局属性TARGET_SUPPORTS_SHARED_LIBS设置为false并且您使用共享库时,会出现此错误消息.请参阅Source/cmAddLibraryCommand.cxxCMake源中的第100行.

除非您为非常基本的系统(嵌入式操作系统)进行交叉编译,否则通常不会发生这种情况.

我怀疑这是最新版本的CMake中的错误,或者您没有正确配置CMake.

  • 确实.出于某种原因,这里的Linux机器上没有设置`TARGET_SUPPORTS_SHARED_LIBS`.显式设置`SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)`取消警告. (2认同)