CMake找不到头文件的函数

发布于 2022-09-05 02:53:11 字数 1593 浏览 26 评论 0

我的目录结构是这样的

root
|-head
| '-apue.h
| '-apue.c
| '-CMakeLists.txt 
|-src
| |-c01
| | '-test.c
| | '-CMakeLists.txt
| '-main.c
| '-CMakeLists.txt
'-CMakeLists.txt

在这里报错,显示HelloFunc未定义。

main.c:

int main(){
    //HelloFunc();  //注释掉这一行,就会报错显示HelloFunc未定义
    test();         //在这里报错,显示HelloFunc未定义
                    //test()函数在test.c文件里面,
    return 0;
}

test.c:

#include "apue.h"
void test() {
  HelloFunc();
}

apue.h:

#include <stdio.h>
void HelloFunc();

apue.c:

#include "apue.h"
void HelloFunc() {
  printf("Hello World from HelloLib\n");
}

下面是目录下的CMakeLists.txt

root目录的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(Demo)
add_subdirectory(src)
add_subdirectory(head)

head目录的CMakeLists.txt:

set(Head_Files apue)
add_library(Apue ${Head_Files})
target_include_directories(Apue PUBLIC ${PROJECT_SOURCE_DIR})

src目录的CMakeLists.txt:

add_subdirectory(c01)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/head)
set(Main_Files
    main.c
    #ListDirFilesName.c
    )
add_executable(${PROJECT_NAME} ${Main_Files})
target_link_libraries(${PROJECT_NAME} LINK_PUBLIC Apue)
target_link_libraries(${PROJECT_NAME} LINK_PUBLIC c01)

c01目录的

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/head)
add_library(c01 test.c)
target_include_directories(c01 PUBLIC ${PROJECT_SOURCE_DIR})

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不交电费瞎发啥光 2022-09-12 02:53:11

你的目录结构就不清晰,首先不用每个目录下都有个一个cmakelist,一般一个peoject有一个,如果要加测试,在根目录下另起一个test文件夹,调用之前编译的结果。
比如把head和src的文件遍历写入add_execueable或者add_library,设置include_directory等,基本就可以生成了。我看你这个main.c中都没有include头文件,自然是找不到方法会报错。
如果你这个编的是个库,那可以在test目录下再写一个cmakelist,用taget_library_link和link_directory就可以。
如果你的目录结构是库项目一个文件夹,里面是src和head,测试是另一个test文件夹,那已在根目录下写一个cmakelist,表示总的项目,里面用add_sub_directory把每一个项目包含进来。

你可以先写一个最简单的目录,把cmake调试通过了再一步步改。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文