Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“如何写作”;CMakeLists.txt“;对于具有多个子目录的大型项目?_C_Linux_Makefile_Cmake_Codelite - Fatal编程技术网

“如何写作”;CMakeLists.txt“;对于具有多个子目录的大型项目?

“如何写作”;CMakeLists.txt“;对于具有多个子目录的大型项目?,c,linux,makefile,cmake,codelite,C,Linux,Makefile,Cmake,Codelite,我正在从事一个模拟项目:从目标平台获取一个嵌入式C代码库,并尝试在主机上模拟它以进行调试或单步执行代码 操作系统:Ubuntu Linux 14.04,IDE:CodeLite,Makefile生成器:Cmake。我不知道如何为项目编写CMakeLists.txt。以下是代码库的结构(都是用C编写的): 我对Cmake完全陌生。我已经在StackOverflow上阅读了很多关于CMake和线程的资源。但我每次都会感到困惑。我有几个问题: 我是在根目录中只需要一个CMakeLists.txt,还是

我正在从事一个模拟项目:从目标平台获取一个嵌入式C代码库,并尝试在主机上模拟它以进行调试或单步执行代码

操作系统:Ubuntu Linux 14.04,IDE:CodeLite,Makefile生成器:Cmake。我不知道如何为项目编写CMakeLists.txt。以下是代码库的结构(都是用C编写的):

我对Cmake完全陌生。我已经在StackOverflow上阅读了很多关于CMake和线程的资源。但我每次都会感到困惑。我有几个问题:

  • 我是在根目录中只需要一个CMakeLists.txt,还是每个目录都需要一个不同的CMakeLists.txt文件
  • 如何在CMakeLists.txt中递归添加源文件
  • 为了生成MakeFile,我需要在CMakeLists.txt中输入哪些基本命令
  • 基于上述代码结构的示例将被欣赏

    我在根目录下只需要一个
    CMakeLists.txt
    ,还是每个目录都需要一个不同的
    CMakeLists.txt
    文件

    通常,在树的每一层都有一个有意义的

    例如:

    项目根目录CMakeLists.txt: 在项目根目录
    CMakeLists.txt
    中,指定最小的cmake要求、项目名称,并包括包含各种组件的子目录

    root/CMakeLists.txt

    cmake_minimum_required (VERSION 3.5)
    project (my_project C)
    
    add_subdirectory(foo)
    add_subdirectory(bar)
    
    add_library(foo foo.c)
    target_include_directories(foo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    
    add_subdirectory(tests)
    
    add_executable(foo_test foo_tests.c)
    target_link_libraries(foo_test foo)
    
    add_library(bar 
        bar.c 
        bar_impl/bar_impl.c)
    target_include_directories(bar PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    target_link_libraries(bar foo)
    
    add_subdirectory(tests)
    
    add_executable(bar_test bar_tests.c)
    target_link_libraries(bar_test bar)
    
    foo/
    +--- foo.c
    +--- bar.c
    +--- baz/
         +--- baz.c
         +--- bang.c
    
    组件CMakeLists.txt: 然后,在每个组件子目录中,都有另一个
    CMakeLists.txt
    文件,您可以在其中添加库、可执行文件等

    root/foo/CMakeLists.txt

    cmake_minimum_required (VERSION 3.5)
    project (my_project C)
    
    add_subdirectory(foo)
    add_subdirectory(bar)
    
    add_library(foo foo.c)
    target_include_directories(foo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    
    add_subdirectory(tests)
    
    add_executable(foo_test foo_tests.c)
    target_link_libraries(foo_test foo)
    
    add_library(bar 
        bar.c 
        bar_impl/bar_impl.c)
    target_include_directories(bar PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    target_link_libraries(bar foo)
    
    add_subdirectory(tests)
    
    add_executable(bar_test bar_tests.c)
    target_link_libraries(bar_test bar)
    
    foo/
    +--- foo.c
    +--- bar.c
    +--- baz/
         +--- baz.c
         +--- bang.c
    
    root/foo/tests/CMakeLists.txt

    cmake_minimum_required (VERSION 3.5)
    project (my_project C)
    
    add_subdirectory(foo)
    add_subdirectory(bar)
    
    add_library(foo foo.c)
    target_include_directories(foo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    
    add_subdirectory(tests)
    
    add_executable(foo_test foo_tests.c)
    target_link_libraries(foo_test foo)
    
    add_library(bar 
        bar.c 
        bar_impl/bar_impl.c)
    target_include_directories(bar PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    target_link_libraries(bar foo)
    
    add_subdirectory(tests)
    
    add_executable(bar_test bar_tests.c)
    target_link_libraries(bar_test bar)
    
    foo/
    +--- foo.c
    +--- bar.c
    +--- baz/
         +--- baz.c
         +--- bang.c
    
    你按照这个结构来做酒吧等等

    root/bar/CMakeLists.txt

    cmake_minimum_required (VERSION 3.5)
    project (my_project C)
    
    add_subdirectory(foo)
    add_subdirectory(bar)
    
    add_library(foo foo.c)
    target_include_directories(foo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    
    add_subdirectory(tests)
    
    add_executable(foo_test foo_tests.c)
    target_link_libraries(foo_test foo)
    
    add_library(bar 
        bar.c 
        bar_impl/bar_impl.c)
    target_include_directories(bar PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    target_link_libraries(bar foo)
    
    add_subdirectory(tests)
    
    add_executable(bar_test bar_tests.c)
    target_link_libraries(bar_test bar)
    
    foo/
    +--- foo.c
    +--- bar.c
    +--- baz/
         +--- baz.c
         +--- bang.c
    
    root/bar/tests/CMakeLists.txt

    cmake_minimum_required (VERSION 3.5)
    project (my_project C)
    
    add_subdirectory(foo)
    add_subdirectory(bar)
    
    add_library(foo foo.c)
    target_include_directories(foo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    
    add_subdirectory(tests)
    
    add_executable(foo_test foo_tests.c)
    target_link_libraries(foo_test foo)
    
    add_library(bar 
        bar.c 
        bar_impl/bar_impl.c)
    target_include_directories(bar PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    target_link_libraries(bar foo)
    
    add_subdirectory(tests)
    
    add_executable(bar_test bar_tests.c)
    target_link_libraries(bar_test bar)
    
    foo/
    +--- foo.c
    +--- bar.c
    +--- baz/
         +--- baz.c
         +--- bang.c
    
    生成生成文件: 要引导构建,请将cmake指向
    根/CMakeLists.txt

    cd root
    mkdir build
    cd build
    cmake ..
    
    (或使用ide的生成管理器生成其生成配置)

    进一步阅读 有关我在此处使用的各种函数的详细信息,请参阅文档:

    最后,回答第二个问题:

    如何在CMakeLists.txt中递归添加源文件

    不建议这样做(有关更多详细信息,请参阅)

    最好明确列出要包含在目标中的每个文件

    请注意,如果源文件位于多个单独的目录中,但它们都属于同一逻辑目标,则每个目录不需要
    CMakeLists.txt
    文件,只需在文件名中列出子目录即可

    示例:

    cmake_minimum_required (VERSION 3.5)
    project (my_project C)
    
    add_subdirectory(foo)
    add_subdirectory(bar)
    
    add_library(foo foo.c)
    target_include_directories(foo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    
    add_subdirectory(tests)
    
    add_executable(foo_test foo_tests.c)
    target_link_libraries(foo_test foo)
    
    add_library(bar 
        bar.c 
        bar_impl/bar_impl.c)
    target_include_directories(bar PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    target_link_libraries(bar foo)
    
    add_subdirectory(tests)
    
    add_executable(bar_test bar_tests.c)
    target_link_libraries(bar_test bar)
    
    foo/
    +--- foo.c
    +--- bar.c
    +--- baz/
         +--- baz.c
         +--- bang.c
    
    如果您想要为上述所有文件创建一个单一目标
    foo
    ,您可以按如下方式创建它:

    add_library(foo 
       foo.c
       bar.c
       baz/baz.c
       baz/bang.c)
    
    或者如果您确实想使用变量存储
    src的列表

    set(SRCS 
       foo.c
       bar.c
       baz/baz.c
       baz/bang.c)
    
    add_library(foo ${SRCS})
    

    上面列出的结构似乎一团糟。您可能需要先将其分为几个项目。您的目标是否没有调试器?@VTT是的,我同意,结构混乱,我还没有将整个树发布到这里。我希望我有时间组织它,但我需要尽快开始调试,因此我采用了嵌入式代码库。Thanks@ChristianGibbons:我们在嵌入式平台上有一个调试器。然而,它在没有操作系统的裸机上运行,而在平台上调试是疯狂的。目标平台(OMAP)依赖于来自板载FPGA和DSP的连续中断反馈。单步停止该反馈(无线调制停止,因此没有来自DSP的反馈)。我要调试的边缘情况需要始终打开无线调制。这就是为什么我们尝试在主机PC上模拟场景,并单步进入其中。感谢Steve的详细说明。现在我更清楚了。现在我有了一个起点,以及您提供的文档,希望我能够很快深入了解。非常感谢您的反馈。@Steve:我能知道这是什么
    项目(my_project C)
    行指示吗?@AkshayRaiyani这是定义-
    my_project
    是项目的名称(可在变量
    ${project_name}
    中访问,并由某些构建系统(如Visual Studio)使用。)<代码> C <代码>指示此项目是C语言项目(也可以使用,例如,代码> CXX/CODEM)来表示C++语言项目。cmake要求项目的顶级
    CMakeLists.txt
    必须包含对此的文本调用