“如何写作”;CMakeLists.txt“;对于具有多个子目录的大型项目?
我正在从事一个模拟项目:从目标平台获取一个嵌入式C代码库,并尝试在主机上模拟它以进行调试或单步执行代码 操作系统:Ubuntu Linux 14.04,IDE:CodeLite,Makefile生成器:Cmake。我不知道如何为项目编写CMakeLists.txt。以下是代码库的结构(都是用C编写的): 我对Cmake完全陌生。我已经在StackOverflow上阅读了很多关于CMake和线程的资源。但我每次都会感到困惑。我有几个问题:“如何写作”;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,还是
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
文件,只需在文件名中列出子目录即可
示例:
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
必须包含对此的文本调用