9、黑马程序员-C语言inclue和多文件开发

本文介绍了C语言中使用预处理指令#include进行文件包含的方法,包括系统文件与自定义文件的区别,以及如何通过多文件组织代码来提高项目的可维护性和模块化。文中还详细解释了函数声明与定义的作用及它们在不同文件间的使用方式。

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、include


1> 作用:拷贝右边文件的所有内容到#include所在的位置
2> 自定义的文件用"",系统自带的文件用<>
3> #include <stdio.h>的目的:拷贝printf函数的声明

#include<.stdio.h>是一个系统头文件。

#include<abc.txt>相当于把abc.txt文件中的所用内容以纯文本的方式拷贝到当前位置。


#include <stdio.h>
int main()
{
    printf("哈哈哈\n");
    //#include "haha/abc.txt"
#include "/Users/apple/Desktop/iOS课堂共享/0722课堂共享/0727/代码/include/haha/abc.txt"
    return 0;
}

“”表示文件与.c文件处于同一路径,可以使用相对路径也可以使用绝对路径。左边有/的是绝对路径,没有/则为相对路径。

注意:自定义的文件使用“”,系统文件使用<>。

函数如果在调用时,函数定义在调用之后,且前面没有进行相应的声明,则编译器报错;

调用函数,没有函数声明,编译器不会报错,链接时报错,不定义函数反而不报错。

链接:把项目中所以相关的.o目标文件和c语言的函数库合并在一起,生成可执行文件。

通常:

①. 函数的定义放在.c文件中,函数的声明放在.h文件中

②. 如果要是有某个.c文件中定义的函数,只需要包含.c文件对应的.h文件即可

③. .h文件生下来就是打酱油被别人拿来拷贝包含的,编译链接时不用写出

二、多文件开发

多文件开发的程序体现:

1、首先定义一个李四.h文件
/*
 李四
 编写函数的声明
 */
int average(int a, int b);
int sum(int a, int b);
int minus(int a, int b);
int multiply(int a, int b);

2、然后定义李四.c文件

/*
 李四
 编写基本算数运算的函数
 */
int average(int a, int b)
{
    return (a + b)/2;
}
int sum(int a, int b)
{
    return a + b;
}
int minus(int a, int b)
{
    return a - b;
}
int multiply(int a, int b)
{
    return a * b;
}

3、最后定义张三.c
/*
 张三
 编写main函数
 
 链接:把项目中所有相关联的.o目标文件、C语言函数库合并在一起,生成可执行文件
 */

#include <stdio.h>
#include "李四.h"
int main()
{
    int score1 = 100;
    int score2 = 70;
    
    int c = average(score1, score2);
    int d = sum(score1, score2);
    
    printf("平均分是%d\n", c);
    printf("总分是%d\n", d);
    
    // \n 是一个转义字符
    // \t tab键
    // \" 一个双引号
    // printf函数返回的字符串常量的字符数,并不是字数
    // 1个汉字占据3个字符
    int e = printf("哈h\"\ta\n");
    
    printf("e=%d\n", e);
    return 0;
}


程序讲解:

 1.函数的定义放.c文件,函数的声明放.h文件
 2.如果要使用某个.c文件中定义的函数,只需要#include这个.c文件对应的.h文件
 3..h文件的作用:被别人拷贝。编译链接的时候不需要管.h文件
 4.cc xx.o xxx.o 将多个目标文件链接在一起
 cc xx.c xxx.c 将多个源文件编译、链接

三、补充

(1)main函数的返回值是返回给操作系统的,0为正常退出,其他值为非正常退出。用以进行系统日志,其实它返回任何值对程序本身没有影响,仅仅只是标记

(2)Printf函数的返回值为字符数。如printf(“abc”);则返回值为3,若printf(“abc男\n”);的返回值为7,因为一个中文占3个字符


------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

<think>我们正在讨论的是ais_client相关的头文件库文件的包含方式。根据之前的对话,ais_client是摄像头系统中的一个客户端组件,用于与ais_server通信。在开发使用ais_client的应用程序时,我们需要包含正确的头文件链接相应的库。虽然引用内容中没有直接提到ais_client的头文件库路径,但我们可以根据常见的嵌入式系统开发实践引用中提供的线索来推断。引用[3]展示了一个示例项目的目录结构,这为我们提供了头文件库的存放位置的参考:```vendor/mediatek/proprietary/hardware/mtkcam3/3rdparty/customer/tp_watermark/├──Android.mk├──include│└──watermark.h├──lib│├──arm64-v8a││└──libwatermark.so│└──armeabi-v7a│└──libwatermark.so...```通常,在项目中包含头文件链接库的方式如下:1.**头文件包含**:-将头文件所在目录添加到编译器的头文件搜索路径中。例如,如果头文件在`include`目录下,则在编译时添加`-I/path/to/include`选项。2.**库文件链接**:-将库文件所在目录添加到链接器的库搜索路径中。例如,使用`-L/path/to/lib`。-指定要链接的库名。例如,`-lais_client`(假设库文件名为`libais_client.so`)。对于ais_client,我们假设它的头文件库文件也以类似的方式组织。具体路径可能因项目而异,但我们可以根据项目环境进行查找。###步骤:1.**查找头文件位置**:-通常,ais_client的头文件可能位于项目的某个目录下,例如:-`vendor/qcom/proprietary/ais/client/include/`-或者参考引用[3]中的结构,可能在`hardware/ais/client/include/`等类似路径。2.**查找库文件位置**:-库文件通常位于`lib`目录下,并按照架构(如arm64-v8a,armeabi-v7a)存放。例如:-`vendor/qcom/proprietary/ais/client/lib/arm64-v8a/libais_client.so`###在项目中的配置方法:####在Android.mk中(适用于AndroidNDK构建)```makefileLOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#设置模块名LOCAL_MODULE:=your_module#添加头文件搜索路径LOCAL_C_INCLUDES+=\$(LOCAL_PATH)/../ais_client/include\#根据实际路径调整...#其他路径#添加源文件LOCAL_SRC_FILES:=your_source_files.cpp#添加库依赖LOCAL_SHARED_LIBRARIES:=ais_client...#其他库#添加库文件搜索路径(如果需要)LOCAL_LDFLAGS+=-L$(LOCAL_PATH)/../ais_client/lib/$(TARGET_ARCH_ABI)include$(BUILD_SHARED_LIBRARY)#或者BUILD_EXECUTABLE等```####在CMakeLists.txt中(适用于CMake构建)```cmakecmake_minimum_required(VERSION3.4.1)#设置头文件路径include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../ais_client/include)#设置库文件路径link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../ais_client/lib/${ANDROID_ABI})#添加你的目标add_library(your_librarySHAREDyour_source_files.cpp)#链接库target_link_libraries(your_libraryais_client#链接libais_client.so...#其他库)```###注意事项:1.**路径正确性**:确保头文件库文件的实际路径与配置的路径一致。如果ais_client作为预构建库提供,需要确认其存放位置。2.**架构匹配**:链接库时注意选择与目标架构(arm64-v8a,armeabi-v7a等)对应的库文件。3.**依赖关系**:ais_client可能依赖其他库,需要一并链接。###调试建议:-如果编译时找不到头文件,检查`LOCAL_C_INCLUDES`或`include_directories`中的路径是否正确。-如果链接时找不到库,检查`LOCAL_LDFLAGS`或`link_directories`中的路径,以及是否在`LOCAL_SHARED_LIBRARIES`或`target_link_libraries`中正确指定了库名。由于具体项目结构可能不同,以上路径仅为示例。请根据实际项目中的文件位置进行调整。§§相关问题§§1.如何确认ais_client的头文件库文件在项目中的具体路径?2.在Android系统中,ais_client的库文件通常存放在哪个目录?3.如果编译时提示找不到ais_client的函数定义,可能是什么原因?</think>### 如何在项目中正确包含 ais_client 的头文件链接库 根据摄像头系统开发实践引用内容,正确包含 ais_client 的方式如下: #### 1. **头文件包含路径** 在代码中引用 ais_client 相关头文件时,需添加以下路径(以高通平台为例): ```c #include <ais/ais_client.h> // 核心客户端接口 #include <qcarcam.h> // 摄像头操作接口 #include <ais_server_interface.h> // 服务通信接口 ``` **配置方法**: - **Android.mk**(NDK 构建): ```makefile LOCAL_C_INCLUDES += \ vendor/qcom/proprietary/ais/client/include \ vendor/qcom/proprietary/ais/common/include ``` - **CMake**(现代 Android 项目): ```cmake include_directories( ${CMAKE_SOURCE_DIR}/vendor/qcom/proprietary/ais/client/include ${CMAKE_SOURCE_DIR}/vendor/qcom/proprietary/ais/common/include ) ``` #### 2. **库文件链接配置** ais_client 的核心库通常命名为 `libais_client.so` 或 `libqcarcam.so`,需根据架构链接: - **Android.mk** 配置: ```makefile LOCAL_SHARED_LIBRARIES += \ libais_client \ libqcarcam \ libais_server_interface LOCAL_LDFLAGS += -L$(LOCAL_PATH)/../ais/client/lib/$(TARGET_ARCH_ABI) # 指定库路径 ``` - **CMake** 配置: ```cmake add_library(ais_client SHARED IMPORTED) set_target_properties(ais_client PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/vendor/qcom/proprietary/ais/client/lib/${ANDROID_ABI}/libais_client.so ) target_link_libraries(your_project ais_client qcarcam) ``` #### 3. **路径参考结构(基于引用[3])** 实际项目中的典型路径结构: ``` vendor/qcom/proprietary/ais/ ├── client/ │ ├── include/ # 头文件目录 │ │ ├── ais_client.h │ │ └── qcarcam.h │ └── lib/ # 库文件目录 │ ├── arm64-v8a/ # 64位库 │ │ ├── libais_client.so │ │ └── libqcarcam.so │ └── armeabi-v7a/ # 32位库 │ ├── libais_client.so │ └── libqcarcam.so └── server/ # ais_server 相关 ``` #### 4. **关键注意事项** 1. **架构匹配**:确保链接的库文件与目标设备架构(arm64-v8a/armeabi-v7a)一致[^3] 2. **依赖顺序**:先链接 `libais_client` 再链接图像处理库(如示例中的 `libwatermark.so`[^3]) 3. **符号查找**:若出现 `undefined reference` 错误,检查: ```bash nm -D libais_client.so | grep qcarcam_open # 验证符号是否存在 ``` 4. **服务依赖**:运行时需确保 `ais_server` 进程已启动,否则客户端调用会失败 > 提示:完整路径可能因平台而异,建议在设备上通过 `find /vendor -name libais_client.so` 定位实际库路径[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值