繁体   English   中英

如何在不使用另一个 CMakeLists.txt 的情况下将文件包含在 CMake 项目的子目录中

[英]How to include files in a subdirectory of a CMake project, without using another CMakeLists.txt

我有一个项目作为子模块添加到另一个使用 CMake 的项目。 子模块只有两个文件( bcbh )所以项目结构是:

root/
 | CMakeLists.txt
 | main.cc
 | a.cc
 | a.h
 | submodule/
 |   |  b.c
 |   |  b.h

我不想向子模块添加另一个 CMakeLists.txt,因为它只是另一个需要维护的 git 东西。 子模块永远不会超出这两个文件,所以我只想要一些简单的东西,而 CMake 对于我的其他一些项目来说太过分了,所以我不希望它出现在子模块的 git 仓库中。

如果我尝试include_directories(submodule)并将submodule/bc添加到我的add_executable块的源列表中,我会得到对bc/h中函数的未定义引用

有没有一种快速简单的方法可以将这些额外的文件添加到源中而不会得到未定义的引用? 或者有更好的方法来管理这个小图书馆吗?

我有

include_directories(${PROJECT_SOURCE_DIR}/submodule)

...

add_executable(${NAME}
    submodule/b.c
    main.cpp
    server.cc
)

我也试过添加

target_link_directories(${NAME} PUBLIC 
    ${PROJECT_SOURCE_DIR}/submodule
)

错误是:

/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: CMakeFiles/light.dir/
server.cc.obj: in function `tcpRecvCallback(void*, tcp_pcb*, pbuf*, signed char) [clon
e .part.0]':
server.cc:(.text._Z15tcpRecvCallbackPvP7tcp_pcbP4pbufa.part.0+0x62): undefined referen
ce to `http_req_parse(char*)'
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/light.dir/build.make:3083: light.elf] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:1520: CMakeFiles/light.dir/all] Error 2
gmake: *** [Makefile:156: all] Error 2                    

其中server.cc在项目根目录下, http_req_parsebc中的一个函数

main.cpp包含server.h ,其中包含submodule/bh

我正在为 raspberry pi pico W 构建可能是相关的。

新答案:

include_directories(${PROJECT_SOURCE_DIR}/submodule)

set(SOURCES submodule/b.c)

add_executable(${PROJECT_NAME} SOURCES)

旧答案:

include_directories(${PROJECT_SOURCE_DIR}/submodule)

file(GLOB submodule_source submodule/*.c)

add_executable(${PROJECT_NAME} submodule_source)

事实证明,以上所有答案都是正确的,我忘记使用特定语言的守卫,因为我的库是用 C 编写的,而我的项目是用 C++ 编写的。

即,我没有

#ifdef _cplusplus
extern "C" {
#endif

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM