CMake 添加库
CMake adding a library
我目前只是想为 VTK 添加一个库到 example 之一。
所以让我们假设我们有这样一个场景,我想在其中重新定义行为或轨迹球。我所做的是创建我自己的轨迹球(基于 vtkInteractorStyleTrackballCamera
提供的模型)。所以我创建了两个文件:InteractorStyleTrackballCamera.cpp 和 InteractorStyleTrackballCamera.h
当我CMake时,一切都很好。但是,当我使用 Visual Studio 2013 打开解决方案并尝试构建 all_build 目标时,我收到一条错误消息:
InteractorStyleTrackballCamera.h no such file or directory.
我当然知道这是什么意思,但是我不明白为什么会出现这个错误。可能是我的 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_BUILD
、InteractorStyleTrackballCamera
(使用 header 和 cpp)TrackballCamera
和 ZERO_CHECK
。所以这就是让我困惑的地方。如果 header 包含在我的解决方案资源管理器中,那么在我尝试构建时应该能找到它是不是对的?
哦,如果你想知道我的 InteractorStyleTrackballCamera
里面有什么(不确定这是否真的与那个问题相关),我只是 copied/pasted vtkInteractorStyleTrackballCamera
的内容并替换了所有 vtkInteractorStyleTrackballCamera
来自 InteractorStyleTrackballCamera
在此先感谢您的帮助。
编辑:当我尝试包含我的 header 时,错误不是来自文件 InteractorStyleTrackballCamera.cpp
,而是来自文件 TrackballCamera.cxx
。
基本上该行是:
#include <InteractorStyleTrackballCamera.h>
#include <...>
应该只用于包含库 header。如果要从源目录中包含 header 文件,请使用 #include "..."
.
对于大多数编译器,区别在于 #include "..."
还会在源文件的目录中搜索要包含的文件,而 #include <...>
仅搜索包含在编译器的 command-line 中指定的目录(加上一些默认的)。
与原始问题无关,但在我看来你应该 link InteractorStyleTrackballCamera
即使 VTK_LIBRARIES
已定义:
if(VTK_LIBRARIES)
target_link_libraries(TrackballCamera InteractorStyleTrackballCamera ${VTK_LIBRARIES})
else()
target_link_libraries(TrackballCamera vtkHybrid vtkWidgets InteractorStyleTrackballCamera)
endif()
我看到问题已经得到解答。此外,请阅读
的文档
target_include_directories
在 CMAKE 中,您可以为目标注入属性,将其传递到依赖它的目标中。其中一个属性是 "include directories"。这属性在以下3种情况下是不同的:
- 您的目标本身正在构建中
- 您的目标与依赖项在同一个项目中
- 您的目标已安装,正在使用 find_package
获取
target_include_directories
允许您在所有 3 种情况下设置正确的路径。
另请参阅 target_link_libraries
,它可用于确保您的库所依赖的库被拉入任何依赖目标。
迷茫了吗?我花了几个月的时间才明白这一点。一旦我这样做了,我就意识到 CMAKE 是多么强大。
我目前只是想为 VTK 添加一个库到 example 之一。
所以让我们假设我们有这样一个场景,我想在其中重新定义行为或轨迹球。我所做的是创建我自己的轨迹球(基于 vtkInteractorStyleTrackballCamera
提供的模型)。所以我创建了两个文件:InteractorStyleTrackballCamera.cpp 和 InteractorStyleTrackballCamera.h
当我CMake时,一切都很好。但是,当我使用 Visual Studio 2013 打开解决方案并尝试构建 all_build 目标时,我收到一条错误消息:
InteractorStyleTrackballCamera.h no such file or directory.
我当然知道这是什么意思,但是我不明白为什么会出现这个错误。可能是我的 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_BUILD
、InteractorStyleTrackballCamera
(使用 header 和 cpp)TrackballCamera
和 ZERO_CHECK
。所以这就是让我困惑的地方。如果 header 包含在我的解决方案资源管理器中,那么在我尝试构建时应该能找到它是不是对的?
哦,如果你想知道我的 InteractorStyleTrackballCamera
里面有什么(不确定这是否真的与那个问题相关),我只是 copied/pasted vtkInteractorStyleTrackballCamera
的内容并替换了所有 vtkInteractorStyleTrackballCamera
来自 InteractorStyleTrackballCamera
在此先感谢您的帮助。
编辑:当我尝试包含我的 header 时,错误不是来自文件 InteractorStyleTrackballCamera.cpp
,而是来自文件 TrackballCamera.cxx
。
基本上该行是:
#include <InteractorStyleTrackballCamera.h>
#include <...>
应该只用于包含库 header。如果要从源目录中包含 header 文件,请使用 #include "..."
.
对于大多数编译器,区别在于 #include "..."
还会在源文件的目录中搜索要包含的文件,而 #include <...>
仅搜索包含在编译器的 command-line 中指定的目录(加上一些默认的)。
与原始问题无关,但在我看来你应该 link InteractorStyleTrackballCamera
即使 VTK_LIBRARIES
已定义:
if(VTK_LIBRARIES)
target_link_libraries(TrackballCamera InteractorStyleTrackballCamera ${VTK_LIBRARIES})
else()
target_link_libraries(TrackballCamera vtkHybrid vtkWidgets InteractorStyleTrackballCamera)
endif()
我看到问题已经得到解答。此外,请阅读
的文档target_include_directories
在 CMAKE 中,您可以为目标注入属性,将其传递到依赖它的目标中。其中一个属性是 "include directories"。这属性在以下3种情况下是不同的:
- 您的目标本身正在构建中
- 您的目标与依赖项在同一个项目中
- 您的目标已安装,正在使用 find_package 获取
target_include_directories
允许您在所有 3 种情况下设置正确的路径。
另请参阅 target_link_libraries
,它可用于确保您的库所依赖的库被拉入任何依赖目标。
迷茫了吗?我花了几个月的时间才明白这一点。一旦我这样做了,我就意识到 CMAKE 是多么强大。