簡體   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