首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CMake:我可以将ExternalProject包装在某个对象中,这样我就可以链接到我的目标了吗?

CMake是一个跨平台的开源构建工具,用于自动化构建、测试和安装软件项目。它使用CMake语言来描述构建过程,并生成与平台无关的构建脚本,以便在不同的开发环境中构建项目。

在CMake中,ExternalProject是一个模块,用于处理外部项目的构建和集成。通过将ExternalProject包装在一个对象中,可以方便地在CMake项目中引用和使用这些外部项目。

链接到目标的过程可以通过在CMakeLists.txt文件中使用target_link_libraries()函数来完成。该函数用于将目标与其他目标或库文件进行链接。

下面是一个使用ExternalProject并链接到目标的示例:

代码语言:txt
复制
cmake_minimum_required(VERSION 3.0)
project(MyProject)

# 引入ExternalProject模块
include(ExternalProject)

# 定义外部项目
ExternalProject_Add(
    MyExternalProject
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external_project
    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/external_project
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
)

# 定义主项目
add_executable(MyExecutable main.cpp)

# 添加依赖关系
add_dependencies(MyExecutable MyExternalProject)

# 链接到目标
target_link_libraries(MyExecutable ${CMAKE_CURRENT_BINARY_DIR}/external_project/libexternal.a)

在上述示例中,MyExternalProject是一个外部项目,它被包装在一个对象中。通过add_dependencies()函数,将MyExternalProject作为MyExecutable的一个依赖项,然后通过target_link_libraries()函数将其链接到MyExecutable目标中。

这样,当构建MyExecutable时,CMake会自动构建并集成MyExternalProject,并将其链接到最终生成的可执行文件中。

需要注意的是,上述示例中的路径和文件名仅作为示意,实际使用时需要根据具体情况进行修改。

关于CMake的更多详细信息,您可以参考腾讯云提供的CMake相关文档和教程:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CMake 秘籍(五)

作为源文件: add_executable(bt-randomgen-example bt-randomgen-example.f90) 最后,我们将CMakeLists.txt叶中生成的库目标链接到我们的可执行目标...CMake 如何确定目标的链接器语言?对于不混合编程语言的目标,选择很简单:通过用于生成对象文件的编译器命令调用链接器。...(如可执行文件)的对象文件的档案 SHARED,用于创建共享库;即,可以在运行时动态链接和加载的库 OBJECT,用于创建对象库;即,不将对象文件归档到静态库中,也不将它们链接成共享对象...这里引入的MODULE选项将生成一个插件库;也就是说,一个动态共享对象(DSO),它不会被动态链接到任何可执行文件中,但仍然可以在运行时加载。.../test.py ) 在 第十一章《打包项目》中,我们将讨论如何创建一个可以使用 pip 安装的 Python 包,其中头文件和库文件将安装在定义良好的位置,这样我们就不必定义任何环境变量来使用 Python

73120
  • 面向 C++ 的现代 CMake 教程(三)

    只有.data和.bss段将为每个消耗库的进程创建单独的实例(这样每个进程就可以修改自己的变量,而不会影响其他消费者)。 得益于这种方法,系统中的整体内存使用情况得到了改善。...避免根据普遍的商业逻辑创建和维护代码的成本是很重要的。这样,你就可以将时间投入到对你和你的客户有意义的事情上。 外部依赖不仅用于提供框架和功能以及解决古怪的问题。...FetchContent_MakeAvailable()是在 CMake 3.14 中添加的,以将最常用的场景封装在一个命令中。...既然我们已经知道如何在一个适当的目标中结构一个可测试的项目,那么让我们将重点转移到测试框架本身。我们不想手动将每个测试用例添加到我们的列表文件中,对吧?...为了测试它,我们需要将一个随机数生成器封装在一个可以被模拟(或者说,用一个模拟对象替换)的类中。模拟对象将允许我们强制一个特定的响应,即“伪造”一个随机数的生成。

    67200

    spring整合各种RPC框架(netty、dubbo、dubbox、gRPC、Motan、Tars)-续(Tars)

    Tars这个名字来自《星际穿越》电影中机器人Tars, 电影中Tars有着非常友好的交互方式,任何初次接触它的人都可以轻松的和它进行交流,同时能在外太空、外星等复杂地形上,超预期的高效率的完成托付的所有任务...:服务端接口对象的基类); 客户端: NetThread:收发包,连接管理,多线程(可配置),采用epoll ET触发实现,支持tcp/udp; AdapterProxy:具体服务器某个节点的本地代理,...单向,Tars协议和非Tars协议; AsyncThread:异步请求的回应包处理线程; Callback:具体业务Callback的处理基类对象。...~~~~当然好多坑就没记录了~ 缺少了perl安装perl就可以了 ?...然后打maven的war包,注意是war包,还有切记把以下加到maven的plugins中 maven-war-plugin

    2.1K20

    CMake简易指南

    的运行大致分两到三步,下述样例属于cmake 控制台命令:配置:输入源文件目录,指定目标编译系统,添加编译选项,生成目标编译系统编译:输入目标编译系统,执行编译安装(可选):将编译产物安装到指定位置(...=lld)属性继承 (手动划重点)target_开头的一些设置参数的函数是CMake3之后支持的,可以理解为它将target定义成了一个对象,对象中包含了若干成员(编译参数)// 以下为解释target...pathA 的定义,libB 依赖 libA 时无需再手动添加 include pathA,target 应当做到自给自足自定义目标在 cmake 中,除了库和执行文件可以作为目标,一些自定义操作也可以作为目标...,并链接指定的系统库文件,生成最终的目标文件。...除去ExternalProject,cmake 在 3.11 版本中加入了FetchContent,功能更实用合理利用扩展系统,避免将一些三方库或者数据直接塞进仓库中,能避免仓库产生不必要的体积膨胀策略

    87350

    多年C++开发使用经验总结

    而这点之所以重要,是因为你在利用某个第三方库的时候,往往需要大概研究下它的编译过程。 CMake的官方文档和stackoverflow上的问答也比较完善。...thirdparty可以是一个本地项目,也可以是一个git仓库或者http链接 所以总的来看,Bazel对thirdparty支持还是非常友好的。 就这点对比来看,CMake其实做的是不太好的。...CMake尽管也有ExternalProject https://cmake.org/cmake/help/latest/module/ExternalProject.html的feature,但根据实际经验来看...我自己在开发中,觉得非常方便必须使用的新特性有: 智能指针 右值,以及C++14中右值得capture lambda, bind initialize list 想补充说一下的是auto,我自己不是特别喜欢这个...feature,也非常赞同google规范中的对auto的限制:仅当可以提高代码可读性时,使用auto 这里不由得就想扯起java 10中的var。

    3K30

    在MacOS上源码安装OpenCV-4.0.0

    python python不用多说吧,安装方式很多,可以走官方安装包安装或者利用anaconda工具进行安装,总之安装好python3版本的就可以了,建议安装3.6版本。...这里推荐anaconda,然后将anaconda的python设置为系统python(可以安装在系统环境中,也可以安装在虚拟环境中),在编译opencv的时候会自动寻找当前python路径。...pip install numpy 如果不确认是否安装好可以在之后的cmake生成的config信息中查看是否正确找到。...这样依赖包也就安装完毕,开始编译吧。...这里我不进行python2.7的链接,只进行了python3版本的链接,然后产生了cmake的config信息,从信息中我们可以看出cmake是否找到了合适的依赖包以及其他环境(以下显示python3版本正确找到了

    40240

    【杂谈】手把手带你配置深度学习环境

    作者&编辑 | 汤兴旺 在配置之前,我先带大家看下目前大众对深度学习环境配置的需求情况。下图是某个购物平台的信息。...从上图我们可以看出,许多想进入人工智能领域或者深度学习领域的朋友,对深度学习环境配置都很头疼,我旁边有许多朋友,编译OpenCV或者caffe少则一周多则一个月,这样的时间消耗无疑打击了学习的信心,也就真成为了从入门到放弃...1.2、OpenCV安装包 对于OpenCV安装包你可以去官网下载,官网链接如下: https://opencv.org/releases/ 或者在公众号后台回复深度学习环境配置即可得到安装包。...完成上面的准备工作后,就可以cmake了,这里我修改了安装路径为/usr/local/opencv4,可以自己修改到自己需要的位置,如果该命令中不加-D CMAKE_INSTALL_PREFIX=/usr...2.6、安装过程中遇到的问题 ? 将Makefile.config中CUDA_ARCH的内容改成下面的就行。 ? 对于我配置好的Makefile和config文件,若有需要请加入我的知识星球获取。

    75260

    给cmake-toolset和工具链加HTTP2和HTTP3支持

    其中 quictls版本的openssl 对一些非Google系的开源库支持性更好一些。在 cmake-toolset 中两种都支持,但是我们首选 quictls版本的openssl。...由于 cmake-toolset 中增加第三方库的流程已经比较成熟了,所以加这些组件的编译流程并不是什么难事。但是最后集成这个几个库组合起来的时候,还是碰到了一些问题。...这里借鉴了官方 Moudle ExternalProject 的方式,加了一个类似 LIST_SEPARATOR 的选项,在接口里层做转换。...如果按照cmake CONFIG的标准模式来,这些宏应该在install的时候导出到CONFIG文件里,这样下游模块链接的时候就能自动加上这个宏。...最后 至此,整个适配接入就完成了,可能哪天有空了也我可以试着接入一下 msquic ,这样可选项就更多了。 也欢迎有兴趣的小伙伴互相交流研究。

    79620

    万字总结编译利器CMake,从入门到项目实战演练

    这个库会包含我们自己的平方根实现。如此,应用程序就可以使用这个库而非编译器提供的库了。在这个教程中,我们将库放入一个叫MathFunctions的子文件夹中。...现在你就可以编译这个教程了,然后输入make install(或者编译IDE中的INSTALL目标),则头文件、库和可执行程序等就会被正确地安装。...使用要求可以更好地控制库或可执行文件的链接和include行,同时还可以更好地控制CMake内部目标的传递属性。...利用使用要求的主要命令是: 目标编译定义 目标编译选项 目标包含目录 目标链接库 让我们从第2步中重构代码,以利用现代的CMake方法编写使用要求。...既然调试和发行版本均已完成,我们就可以使用自定义的MultiCPackConfig.cmake文件将两个版本打包到一个发行版中。 cpack --config ../..

    1.3K00

    面向 C++ 的现代 CMake 教程(四)

    } ) endfunction() 在这个例子中,我们创建了一个 CMake 模块(这样我们就可以在不同的项目中重复使用同一个文件)来包装接受要测试的目标的函数。...请注意,Doxygen 是使用 CMake 构建的,因此你也可以轻松地从源代码编译它。 当 Doxygen 和 Graphviz 安装在系统中时,我们可以将生成功能添加到我们的项目中。...-v, --verbose:这会使输出详细(这也可以通过设置 VERBOSE 环境变量来实现)。 安装可以由许多步骤组成,但它们的本质是将生成的工件和必要的依赖项复制到系统上的某个目录中。...请注意,install(FILE)中的DESTINATION和install(FILES)中的INSTALL_DESTINATION是相同的,这样就可以正确计算相对路径。...就这样——我们的包已经完全配置好了。 在下一节中,我们将学习什么是组件以及如何将它们与包一起使用。

    68200

    CMake 秘籍(三)

    这将添加一些我们可以链接的目标。在本例中,我们对gtest_main感兴趣。...但是,可能会有情况,你希望将测试的非零返回代码定义为成功;换句话说,你可能想要反转成功和失败的定义。在本节中,我们将展示这样的情况。...这样,自定义目标可以在与其依赖项不同的目录中指定,这在为项目设计模块化 CMake 基础设施时非常有用。 准备工作 对于这个配方,我们将重用前一个配方的源代码示例。然而,我们将稍微修改源文件的布局。...,就可以通过使用 add_custom_command 将附加命令附加到目标上。...在本例中,我们将使用一个导入的目标来链接 MPI,该功能仅从 CMake 3.9 开始提供。然而,生成器表达式的方面可以转移到 CMake 3.0 或更高版本。

    60320

    抛弃 Autotools 向 CMake 迈进吧

    最后,在 make install 一步中,那些编译过的文件将被拷贝到(在 cmake 步骤中扫描出来的)计算机上合适的位置。 这看起来很简单,当你使用 CMake 时就是这样。...因此,它与你在终端中执行带有 -o Hello 的 gcc 命令是一样的。 在一些比较复杂的项目中,你可能还需要使用库文件,你可以使用 add library 命令来链接库文件。...你可以使用与包含编译文件时类似的工作流程,将任意数据包含在 CMake 项目中:在 CMakelists.txt 文件中使用 file 命令,然后说明一下这些文件要安装在哪里。...因为我不希望我的简单的 “hello world” 应用程序真的被安装到我的系统上,我设置了 --prefix 选项,将 CMake 的目标从根目录(/)重定向到 /tmp 的一个子目录。...同样,为了避免在我的系统上安装一个演示程序,我在这个例子中设置了 DESTDIR 变量,将安装目标重定向到 /tmp 的一个子目录: $ mkdir /tmp/dist-hello $ make install

    45220

    Tina下运行在Ubuntu中交叉编译的Opencv 4.5.1

    看个人需求 我自己是勾上的 这样在链接的时候好链接 文件更改 (1)/d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc...这个错误是因为没有关上jpeg 暂时只能将这个包关掉做编译(类型错误,没有修正) 这个错误是没有在上面加 -latomic 如果以上都没有 ,你就可以顺利编译下来 然后你就可以在...install 目录下 看到我们交叉编译后的文件了 在移动到板子之前,我们需要将atimic (原子操作库) 移动到我们的lib 目录,因为 Tina 默认没有将原子库打包进固件内。...然后就可以使用adb 将其 发送至开发板中。...芜湖 注意 我们在编译的过程中 关掉了 jpeg 的相关包,所以在 imwrite 等操作时 ,无法解析 jpg 文件会出现这样的报错: terminate called after throwing

    18310

    面向 C++ 的现代 CMake 教程(五)

    第十一章 安装和打包: 最后,我们将配置解决方案的安装和打包。我们将准备形成包的文件,以及目标定义。我们将使用GNUInstallDirs模块将该解决方案和构建目标的艺术品安装到适当的目录中。...对象库 对象库用于将多个源文件组合到一个单一的逻辑目标中,并在构建过程中编译成(.o)目标文件。...更重要的是,共享库以单独的文件形式提供,必须安装在特定的路径上,动态链接器才能找到它们,而静态库作为可执行文件的一部分合并。...启用静态分析的说明! 添加静态分析工具 我们将业务代码列表文件的继续推迟到现在,这样我们就可以在适当的情况下讨论添加的模块。...,我们可以通过将其封装在可重用的 CMake 包中来使库对其他 CMake 项目可见。

    18700

    重构基于CMake的构建工具链

    很多老式的系统和工具都会尝试去走相对标准化的安装过程,比如说用 pkg-config 或者用系统自带的包管理工具装在系统默认路径里。 当然这样很不方便,也不容易定制组件。...在 cmake-toolset 里我也添加了对 vcpkg 的适配支持。可以直接导入 vcpkg 的toolchain文件使用,大多数导入的依赖库都支持直接从 vcpkg 中查找 。...这样在上层需要定制化的时候就比较容易了。 稍微列举一下整理迁移过程中的新问题吧: NOCONFIG 有些环境会生成 NOCONFIG 的cmake config模块。...然后如果父级项目指定了 CMAKE_BUILD_TYPE 的话会找不到匹配的链接目标。所以我写了工具自动导出某些特定 CMAKE_BUILD_TYPE fallback到未指定的配置。...这样可以适配一些依赖包的查找过程。 交叉编译的二进制 交叉编译的时候,有时候需要编译出host版本的二进制使用。

    5.1K10

    为VSCOde安装vcpkg(GitHub加速加速福利)

    \vcpkg.exe 参数 这样执行, 我这里是使用了一下搜索 就是打印出所有可以使用的库 jsoncpp 我这里尝试安装这个CPP的库 ....\vcpkg.exe install jsoncpp:x64-windows 那么就可以使用我写的这个命令一样的编译一个合适的平台 ....\vcpkg.exe remove jsoncpp 当然可以移除掉这个包 .\vcpkg.exe remove --outdated 未来要移除过时的包,就执行这个命令就好了 ....//导出 vcpkg help triplet //帮助 triplet 这些是常见的命令 http://pigcha.com/ 如果你在执行上面的这些命令一点也不丝滑,可能就是你的网不行 懂我的意思了吗...share_id=2b598a12-225b-4c93-ae07-40793914ac07 这个链接是我的分享链接 右下角的应用已经打开了 杂七杂八的设置,实在没哟办法的。

    5.7K30

    面向 C++ 的现代 CMake 教程(二)

    CMake 文档建议,如果我们有这样的部分存在于源树中,它们在自己的 CMakeLists.txt 文件中应该有自己的 project() 命令,这样它们就可以生成自己的构建系统,并且可以独立构建。...具体来说,我指的是内部库。从结构上讲,将它们添加到项目中是有用的,因为相关的事物被包装在单一的逻辑实体中。并且它们可以与其他目标链接——另一个库或一个可执行文件。当多个目标使用同一个库时,这尤其方便。...没有它,可执行文件的编译会失败,因为存在未定义的符号。你注意到我们在这个命令在实际上声明了任何库之前就调用了吗?...代码发射包括根据目标平台指定的格式将优化后的机器代码写入对象文件。这个对象文件不能直接执行——它必须传递给下一个工具,链接器,它将适当移动我们对象文件的各个部分并解决对外部符号的引用。...现在,它只打算供编译器编写者使用,这样他们就可以在开发过程中测试他们的依赖项扫描工具。 当这个备受期待的特性完成并在一个稳定的版本中可用时,我建议彻底研究它。

    70900
    领券