首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型项目的cMake

大型项目的cMake
EN

Stack Overflow用户
提问于 2014-02-11 23:01:30
回答 1查看 4.8K关注 0票数 2

我目前有一个非常大的文件结构,我想移植到cMake,但不幸的是,我很难找到类似于我目前工作的文件结构的例子。

(_C/h指任何文件名)

代码语言:javascript
复制
Project
   Target
        <*.s19/*.elf goes here>
   Component1
        src
            file.c
            file.h
            ____.c
            ____.h
        cfg
            ____.c
            ____.h
        out
            <*.o goes here>
        tmp
            <*.d goes here>
   Component2
        src
            file.c
            file.h
            ____.c
            ____.h
        cfg
            ____.c
            ____.h
        out
            <*.o goes here>
        tmp
            <*.d goes here>
   Component3
        src
            file.c
            file.h
            ____.c
            ____.h
        cfg
            ____.c
            ____.h
        out
            <*.o goes here>
        tmp
            <*.d goes here>

此外,我如何告诉它在某个组件中查找包含,例如,我希望组件1中的文件只查找Component2中的#include。另外,我如何告诉它只在特定的文件列表中编译,例如在src中,我可能只希望它在file1.c中编译,而不是在file2.c中编译。

EN

回答 1

Stack Overflow用户

发布于 2014-02-12 04:17:30

如何在不同组件中使用不同的包含目录(借助@ruslo和@steveire):

  1. 在主CMakeLists.txt中,按照正确的顺序添加组件: add_subdirectory(Component1) add_subdirectory(Component2)
  2. 在Component1 1/CMakeLists.txt中,向生成的库添加一个属性:: Cmake_minimum_required(2.8.11版)"$“"$”add_library(Component1 ${Component1_SOURCES}) target_include_directories(Component1 INTERFACE Target_include_directories)其他所需费用包括)
  3. 在Component2 2/CMakeLists.txt中,使用target_include_directories作为Component2: Cmake_minimum_required(2.8.11版)add_executable(Component2 ${Component2_SOURCES}) target_link_libraries(Component2 Component1)

关于要编译的文件的确切列表。坦率地说,我认为这方面没有任何问题。只需在add_executableadd_library指令中显式地指定它们:

代码语言:javascript
复制
add_binary(Component1Binary test1.c test2.c test5.c)

但我要指出的是,传统上CMake对编译后的工件使用稍微不同的布局。它要么将编译好的工件放在源目录中,要么创建一个完全分离的目录,然后将所有已编译的工件放在其中,完全再现您的项目结构。看一看:

代码语言:javascript
复制
 MyProject/
     CMakeLists.txt <- the top-level CMakeLists.txt. It may simply `add_subdirectory()`s (for each of its `Components`) and configure project-wide settings
     Component1/
         CMakeLists.txt <- this is intented to build artifact(s) for Component1
         src1-1.c
         src1-1.h
         ...
     Component2/
         CMakeLists.txt <- this is intented to build artifact(s) for Component2
         src2-1.c
         src2-1.h
         ...

现在,您可以在文件系统中的任何地方(通常在build.release中的某个位置)创建一个具有任意名称的空目录(例如,MyProject ),然后对该目录进行cd并调用cmake,如下所示:

代码语言:javascript
复制
 cmake [cmake flags like -DCMAKE_BUILD_TYPE=Release and others] path/to/the/MyProject

然后,CMake在这个目录中创建所有必需的Makefile-s和其他构建构件,您可以调用make (或者如果您选择使用ninja而不是make),并且所有构建工件都驻留在该目录中,复制MyProject的原始结构。

代码语言:javascript
复制
build.release/
     Component1/
         src1-1.o
         ...
         Component1.a
     Component2/
         src2-1.o
         ...
         Component2Exe

关于$<BUILD_INTERFACE:...>的更多内容是文档CMakeLists.txt文件中的目录?等。这个特性相对较新,我仍然不确定我做的一切都是绝对正确的(测试示例确实编译了)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21715028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档