CMake ExternalProject_Add() and FindPackage()(CMake ExternalProject_Add() 和 FindPackage())
问题描述
是否有正确的方法可以找到使用 ExternalProject_Add()
构建的库(通过 FindPackage()
)?
Is there are proper way to find a library (via FindPackage()
) which was built with ExternalProject_Add()
?
问题是 CMake 在 CMake 时找不到库,因为外部库是在编译时构建的.我知道在超级构建中构建库和项目时可以组合这两个 CMake 函数,但我想在普通的 CMake 项目中使用它.
The problem is that CMake cannot find the library at CMake-time because the external library gets build at compile time. I know that it is possible to combine these two CMake function when building the library and the project in a superbuild but I want to use it in a normal CMake project.
事实上,我想使用 ExternalProject_Add
构建 VTK 6,并在我的 CMake 项目中使用 FindPackage
找到它.
In fact I would like to build VTK 6 with ExternalProject_Add
and find it with FindPackage
all inside my CMake project.
推荐答案
有一种方法可以做到这一点.但它有点hackish.您基本上添加了一个自定义目标,在构建期间重新运行 cmake.
there is a way to do this. but it´s kind of hackish. you basically add a custom target, that reruns cmake during build.
你必须在一个小型测试项目中尝试这个,以确定它是否适合你
you will have to try this in a small test project, to decide if it works for you
find_package(Beaengine)
############################################
#
# BeaEngine
#
include(ExternalProject)
externalproject_add(BeaEngine
SOURCE_DIR ${PROJECT_SOURCE_DIR}/beaengine
SVN_REPOSITORY http://beaengine.googlecode.com/svn/trunk/
CMAKE_ARGS -DoptHAS_OPTIMIZED=TRUE -DoptHAS_SYMBOLS=FALSE -DoptBUILD_64BIT=FALSE -DoptBUILD_DLL=FALSE -DoptBUILD_LITE=FALSE
INSTALL_COMMAND ""
)
if(NOT ${Beaengine_FOUND})
#rerun cmake in initial build
#will update cmakecache/project files on first build
#so you may have to reload project after first build
add_custom_target(Rescan ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR} DEPENDS BeaEngine)
else()
#Rescan becomes a dummy target after first build
#this prevents cmake from rebuilding cache/projects on subsequent builds
add_custom_target(Rescan)
endif()
add_executable(testapp testapp.cpp )
add_dependencies(testapp Rescan)
if(${Beaengine_FOUND})
target_link_libraries(testapp ${Beaengine_LIBRARY})
endif()
这似乎适用于 mingw makefiles/eclipse makefile 项目.vs 会在第一次构建后请求重新加载所有项目.
this seems to work well for mingw makefiles / eclipse makefile projects. vs will request to reload all projects after first build.
这篇关于CMake ExternalProject_Add() 和 FindPackage()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:CMake ExternalProject_Add() 和 FindPackage()
基础教程推荐
- Windows Media Foundation 录制音频 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 从 std::cin 读取密码 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01