CMake找不到头文件的函数

查看:2732
本文介绍了CMake找不到头文件的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我的目录结构是这样的

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})

解决方案

你的目录结构就不清晰,首先不用每个目录下都有个一个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调试通过了再一步步改。

这篇关于CMake找不到头文件的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆