C程序编译与链接过程(多文件编译以及第三方库的使用)

准备以下main.c文件 

#include <stdio.h>

int add(int,int);

int main()
{
        int a = 3;
        int b = 5;
        printf("add(3,5) = %d\n",add(a,b));
}

int add(int a, int b){
        return a+b;
}

执行命令

gcc -c main.c

生产main.o 文件,这是一个二进制文件

执行

nm -O main.o

结果,有地址的函数定义在这个文件中。

0000000000000043 T add
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T main
                 U printf

删除add的实现,只保留声明,仍然可以通过编译。此时在执行nm -O命令,add地址在外面。

然后将add.c的实现放到另外一个源文件中。

执行

gcc -c add.c

可以通过编译,然后对add.c执行nm-O,发现add.c中又nm的实现。

下面通过命令将两个文件链接到一起。

gcc main.o add.o

单独执行gcc main.o出现常见链接错误,找不到add符号。

如果我们在main函数中,也加上add的实现,那么就会报重定义错误。

 

思考为什么声明和定义要分开?

 

理解了编译和链接两个过程,下面我们在代码中使用第三方库,我们以gtest为例子,去github下载Google Test

之后就是常规C++项目的编译,注意到该项目有CMakeList.txt, 我们新建一个build文件, 进入到build,执行

cmake ..

生成makefile,然后执行

make -j4

编译完源代码之后,我们得到lib文件夹是函数的定义,头文件在include文章夹中。

我们将这两个拷贝到项目路径下,新建一个main.cpp文件

#include <gtest/gtest.h>

int add(int a, int b){
        return a+b;
}

TEST(TEST,ADD1){
        EXPECT_EQ(add(3,4),7);
}


int main()
{
        testing::InitGoogleTest();
        return RUN_ALL_TESTS();

}

如果直接编译g++ main.cpp报错,没有找到gtest/gtest.h头文件, 增加预编译路径

g++ -I./include main.cpp

出现常见链接错误, 链接相应实现后

g++ -I./include -L./lib  main.cpp -lgtest -lpthread

完成功能的实现

 

 

在 Android13 中,要使用编译第三方动态,需要在 Android.mk 文件中进行配置。以下是一个示例 Android.mk 文件: ``` LOCAL_PATH := $(call my-dir) # 预编译的路径 PREBUILT_LIB_PATH := $(LOCAL_PATH)/../prebuilt/$(TARGET_ARCH_ABI) # 预编译的名称 PREBUILT_LIB_NAME := libthirdparty.so include $(CLEAR_VARS) # 应用程序的源文件 LOCAL_SRC_FILES := main.cpp # 应用程序的依赖 LOCAL_LDLIBS := -llog # 应用程序需要链接的预编译 LOCAL_SHARED_LIBRARIES := thirdparty include $(BUILD_SHARED_LIBRARY) # 预编译的定义 include $(CLEAR_VARS) LOCAL_MODULE := thirdparty LOCAL_SRC_FILES := $(PREBUILT_LIB_PATH)/$(PREBUILT_LIB_NAME) LOCAL_EXPORT_C_INCLUDES := $(PREBUILT_LIB_PATH)/include include $(PREBUILT_SHARED_LIBRARY) ``` 在上述示例中,LOCAL_PATH 指定了 Android.mk 文件所在的路径。PREBUILT_LIB_PATH 定义了预编译的路径,PREBUILT_LIB_NAME 定义了预编译的名称。LOCAL_SRC_FILES 指定了应用程序的源文件,LOCAL_LDLIBS 指定了应用程序的依赖。LOCAL_SHARED_LIBRARIES 指定了应用程序需要链接的预编译。 预编译的定义部分包含了 LOCAL_MODULE、LOCAL_SRC_FILES 和 LOCAL_EXPORT_C_INCLUDES。其中,LOCAL_MODULE 定义了预编译的名称,LOCAL_SRC_FILES 指定了预编译的路径和名称,LOCAL_EXPORT_C_INCLUDES 指定了预编译的头文件路径。 通过在 Android.mk 文件中进行配置,可以让 Android13 系统自动搜索和使用编译,提高应用程序的构建效率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值