CMake添加库

时间:2015-10-27 10:47:28

标签: c++ cmake vtk

我目前只是尝试将一个库添加到VTK的example之一。 因此,让我们想象一下,我想要重新定义行为或轨迹球。我在那里做的是创建我自己的轨迹球(基于vtkInteractorStyleTrackballCamera提供的模型)。所以我创建了两个文件:InteractorStyleTrackballCamera.cpp和InteractorStyleTrackballCamera.h

当我CMake时,一切都很好。但是,当我使用Visual Studio 2013打开解决方案并尝试构建all_build目标时,我收到一条错误消息:

  

InteractorStyleTrackballCamera.h没有这样的文件或目录。

我当然知道这意味着什么,但是我无法理解为什么会出现这个错误。可能是我的CMakeLists.txt有点破碎(这是我唯一能想到的),所以这里是:

cmake_minimum_required(VERSION 2.8)

PROJECT(TrackballCamera)

find_package(VTK REQUIRED)
include(${VTK_USE_FILE})

add_executable(TrackballCamera MACOSX_BUNDLE TrackballCamera)
add_library(InteractorStyleTrackballCamera InteractorStyleTrackballCamera.cpp InteractorStyleTrackballCamera.h)

if(VTK_LIBRARIES)
  target_link_libraries(TrackballCamera ${VTK_LIBRARIES})
else()
  target_link_libraries(TrackballCamera vtkHybrid vtkWidgets InteractorStyleTrackballCamera)
endif()

当我在VS13中查看我的解决方案资源管理器时,我可以清楚地看到4个解决方案,ALL_BUILDInteractorStyleTrackballCamera(带标题和cpp)TrackballCameraZERO_CHECK。这让我很困惑。如果标题包含在我的解决方案资源管理器中,那么在我尝试构建时应该找到它吗?

哦,如果你想知道我InteractorStyleTrackballCamera里面的内容(不确定这是否与这个问题真的相关),我只需复制/粘贴vtkInteractorStyleTrackballCamera的内容并替换所有vtkInteractorStyleTrackballCamera 1}} InteractorStyleTrackballCamera

提前感谢您的帮助。

编辑:当我尝试包含我的标题时,错误不是来自文件InteractorStyleTrackballCamera.cpp,而是来自文件TrackballCamera.cxx。 基本上这条线是:

#include <InteractorStyleTrackballCamera.h>

2 个答案:

答案 0 :(得分:3)

我看到问题已得到解答。另外,请阅读

的文档

def user_data(user_id) @user_data ||= {} @user_data[user_id.to_i] || = User.find(user_id).data end

https://cmake.org/cmake/help/v3.3/command/target_include_directories.html#command:target_include_directories

在CMAKE中,您可以将具有属性的目标灌输到依赖于它的目标中。其中一个属性是&#34; include目录&#34;。此属性在以下3种方案中有所不同:

  1. 您的目标正在构建
  2. 您的目标与依赖项目在同一个项目中
  3. 您的目标已经安装并且正在使用find_package
  4. 获取

    target_include_directories允许您在所有3种情况下设置正确的路径。

    另见target_include_directories,可用于确保您的库所依赖的库被拉入任何依赖目标。

    困惑了吗?我花了几个月的时间来解决这个问题。有一次,我意识到CMAKE是多么强大。

答案 1 :(得分:1)

#include <...>应仅用于包含库标头。如果要包含源目录中的头文件,请使用#include "..."

对于大多数编译器,区别在于#include "..."还在源文件的目录中搜索要包含的文件,而#include <...>仅搜索包含编译器命令行中指定的目录(可能还有一些默认值)那些)。

与原始问题无关,但在我看来,即使定义InteractorStyleTrackballCamera,您也应链接VTK_LIBRARIES

if(VTK_LIBRARIES)
  target_link_libraries(TrackballCamera InteractorStyleTrackballCamera ${VTK_LIBRARIES})
else()
  target_link_libraries(TrackballCamera vtkHybrid vtkWidgets InteractorStyleTrackballCamera)
endif()