Cmake - 如何将源文件注入子目录项目

Posted

技术标签:

【中文标题】Cmake - 如何将源文件注入子目录项目【英文标题】:Cmake - how to inject source file into subdirectory project 【发布时间】:2015-07-29 11:48:43 【问题描述】:

我有一个利用另一个 cmake 库项目的 cmake 项目,目录如下所示:

/CMakeList.txt 
/main.c
/.gitmodules
/patch/patch.c
/vendor/CMakeList.txt  
/vendor/vendor.c
/vendor/...

/CMakeList.txt 中,我使用add_subdirectory(vendor) 将供应商库包含/链接到我自己的项目。

/vendor/CMakeList.txt中,源文件由FILE(GLOB SRC_VEN vendor.c ...)添加

我想将/patch/patch.c 注入vendor 库而不接触/vendor 目录,这是一个git 子模块

是否可以在我的根 CMakeList.txt 中使用 cmake 来实现这一点?

谢谢!

【问题讨论】:

/vendor/CMakeList.txt 的真实样子如何?它不是在FILE(GLOB ...) 中使用通配符吗?你是什​​么意思“不接触”?是否可以自动更改任何文件? 在你的add_subdirectory(vendor) 电话之后像target_sources(vendor_target PRIVATE "patch/patch.c") 之类的东西?但是您需要知道要注入的目标名称(vendor_target 只是一个占位符)。有关详细信息,请参阅here。 嗨@m.s。感谢您的回复,是的/vendor/CMakeLists.txt 使用通配符,我提到了“无触摸”供应商,因为我可以稍微修改/vendor/CMakeLists.txt,并在我的.gitmodules 中修改ignore=dirty,这样就不会提交更改 谢谢你,@Florian!刚刚测试,target_sources 就像一个魅力 【参考方案1】:

把我的评论变成答案

如果您想将源代码注入现有目标,您可以使用target_sources()(在 CMake 版本 3.1 中引入)。

在你的情况下,这看起来像:

/CMakeLists.txt

...
add_subdirectory(vendor)
target_sources(vendor_target PRIVATE "patch/patch.c") 

我把vendor_target 作为占位符。请将其替换为您要注入源的目标的真实名称。

有关详细信息,请参阅例如here.

【讨论】:

以上是关于Cmake - 如何将源文件注入子目录项目的主要内容,如果未能解决你的问题,请参考以下文章

怎么在cmake的配置文件里加入

如何在 CMake 项目中包含外部库

CMake项目结构:如何正确地将库合并在一起并将它们包含在多个可执行文件中

CMake方式编译

CMake入门

CMake入门