Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)

news2024/11/25 13:51:18

最近在学习log4cpp库时,使用g++去编译,却发现自己不会链接...,这哪能行,于是网上钻研,终于解决,现在记录下来分享给遇到同样问题的人。


gcc和g++类似,这里就以g++为例!

刚好用到的log4cpp日志库有头文件和动态库.so和静态库.a,这里就以log4cpp库为例。

在安装好log4cpp库后,在路径 /usr/local/ 下有 lib库 和 include头文件

注意:任何库的默认安装路径都是在此 !

然后新建一个文件夹作为项目文件夹,进入此文件夹,然后新建include文件夹,将上图的log4cpp文件夹拷贝到刚刚新建的include文件夹下;然后新建lib文件夹,将上图的liblog4cpp.*全都拷贝到刚刚新建的lib文件夹中;

最终效果如下图:

 然后根据自己的项目需求写好mian函数。

然后就可以开始编译了!

g++ MyLog.cpp test_log4cpp.cpp -std=c++11 -I ./include/ -L ./lib/ -llog4cpp -lpthread -o test_log4cpp

这样就可以正常编译链接了!


介绍

-std=c++11 : 指明项目使用c++11;

-I ./include/ : 指定项目使用的头文件路径,这样项目中使用头文件就不用写全路径了;

                        例如:(否则得 include "./include/log4cpp/Category.hh" 这样使用)

                        

-L ./lib/ : 指定项目链接的库路径;

-llog4cpp :链接liblog4cpp.so库;(链接动态库和静态库都是这样使用,默认链接动态库)

                如果需要链接静态库,可以将静态库改个名字,例如改成liblog4cpp1.a,然后就可以这样去链接静态库:-llog4cpp1

具体 -I -L 指定的路径根据自己项目存放的头文件和库的路径去指定! 


具体参数介绍: 

-L :表示要链接的库所在的目录。-L  表示要链接的库在当前目录, -L  /usr/lib 表示要连接的库在/usr/lib下。目录在/usr/lib时,系统会自动搜索这个目录,不用指明。当库不在  /usr/lib 下,就得使用 -L 去指定需要链接的库的路径,否则编译时无法正常链接,会编译失败!

-l (L的小写) :表示需要链接库的名称,注意不是库文件名称,比如库文件为liblog4cpp.so,那么库名称为log4cpp;静态库也是如此!

-I (i 的大写) :指定头文件的所在的目录,可以使用相对路径。在代码中使用头文件可以不用指明具体路径。

例如:

                


再次提醒注意:

如果动态库和静态库名字一样,例如:liblog4cpp.so 和 liblog4cpp.a

使用 -llog4cpp 去链接此库时,默认链接的是动态库(.so),如果需要链接静态库,可以将动态库删掉,也可以将静态库改个名字,例如改成liblog4cpp1.a;这样再链接时:-llog4cpp1 就可以正确连接到静态库了。

另外:

如果需要链接多个头文件路径或库路径,可以继续使用 -I 和 -L 去链接,例如:

g++ ./commonLog/MyLogger.cpp MyLog.cpp test_log4cpp.cpp -std=c++11 -I ./include/ -I ./commonLog/ -L ./lib/ -L ./commonLog/ -llog4cpp1 -lpthread -o test_log4cpp

小插曲

c++如何调用c的库呢?

如下c代码,编译成库:

c_ku.h

#ifndef _C_KU_H_
#define _C_KU_H_

#include <stdio.h>


void print_hello();
void say_hello(char *str);

#endif // _C_KU_H_

c_ku.c

#include "c_ku.h"

void print_hello() {
    printf("hello world!\n");
}

void say_hello(char *str) {
    if (!str) {
        return;
    }

    printf("say %s\n", str);
}

编译成动态库(.so)和静态库(.a)

gcc -c c_ku.c
ar -rsv libc_ku.so c_ku.o
ar -rsv libc_ku.a c_ku.o

 main.cpp : c++文件

#include <iostream>
#include "c_ku.h"

int main(int argc, char **argv) {

    std::cout << "hello world!" << std::endl;

    print_hello();

    return 0;

}

然后进行编译链接:

g++ main.cpp -I ./ -L ./ -lc_ku -o c_ku

此时会发现报错:

 
解决方案:

在c头文件中使用 extern "C"{ } 去将头文件声明包裹起来!

#ifndef _C_KU_H_
#define _C_KU_H_

#include <stdio.h>

extern "C"{
    void print_hello();
    void say_hello(char *str);
}

#endif _C_KU_H_

再一次去编译运行:

问题完美解决了!

c++可以调用c写的库了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测开:vue入门(1)

目录 一、背景 二、介绍 三、创建项目 3.1 创建vue项目 方式二&#xff1a;直接在html页面中&#xff0c;引入vue 3.2 直接在html页面中&#xff0c;引入vue 3.2.1 引入在线的vue&#xff08;方式一&#xff09; 3.2.2 将vue 下载到本地&#xff08;方式二&#xff09; …

代码随想录算法训练营第二天| 977. 有序数组的平方、209. 长度最小子数组、59.螺旋矩阵II

977 有序数组的平方题目链接&#xff1a;977 有序数组的平方介绍给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。思路看到题目的第一反应&#xff0c;首先负数的平方跟正数的平方是相同的&…

Git系列:常见指令辨析

Git系列&#xff1a;常见指令辨析指令辨析工作区、暂存区、版本库傻傻分不清楚&#xff1f;主干和分支的关系是什么&#xff1f;git fetch/merge/pull辨析日志查看时&#xff0c;git log与git reflog的区别是&#xff1f;git diff和status的区别是&#xff1f;相关资料本文小结…

麒麟系统安全管理工具kysec机制详解

DAC访问控制 Linux下有多种权限控制的机制,常见的有:DAC(Discretionary Access Control)自主式权限控制和MAC(Mandatory Access Control)强制访问控制。 Linux上传统的访问控制标准是自主访问控制Discretionary Access Control(DAC)。在这种形式下,一个软件或守护进程以…

【MyBatis】源码学习 05 - 关于 xml 文件解析的分析

文章目录前言参考目录学习笔记1、章节目录概览2、14.3&#xff1a;SqlSourceBuilder 类与 StaticSqlSource 类3、14.4.2&#xff1a;ResultMapResolver 类3.1、测试代码说明3.2、结果集 userMap 解析流程3.3、结果集 getGirl 解析流程3.4、鉴别器 discriminator 解析流程4、14.…

汽车电子CAN协议上位机软件的设计实现

先不说汽车电子,通常上位机软件如何实现呢?作为控制嵌入式设备的PC端软件,主要功能就是配置和读取嵌入式设备基于特定接口的交互信息,所以首先需要控制一个通讯设备作为中间的通讯媒介。比如sscom5.13.1就可以作为上位机软件工具,它需要一个具有usb转UART通讯的接口设备或…

C#中,Elasticsearch.Net判断空字符串

之前有个业务需求&#xff0c;由于最开始存储到es里的&#xff0c;是默认空字符串&#xff0c;后面程序取数据时&#xff0c;发现需要取空字符串的数据时&#xff0c;不好取出来。 字符串的字段如图&#xff1a; 实际数据如图&#xff1a; 用的是C#语言&#xff0c;使用的是E…

【算法笔记】递归与回溯

递归与回溯 To Iterate is Human, to Recurse, Divine. —L. Peter Deutsch 人理解迭代&#xff0c;神理解递归。 —L. Peter Deutsch 1.什么是递归呢 递归形象描述&#xff1a; 你打开面前这扇门&#xff0c;看到屋里面还有一扇门。 你走过去&#xff0c;发现手中的钥匙还可以…

【Spark分布式内存计算框架——Spark Streaming】11. 应用案例:百度搜索风云榜(下)实时窗口统计

5.5 实时窗口统计 SparkStreaming中提供一些列窗口函数&#xff0c;方便对窗口数据进行分析&#xff0c;文档&#xff1a; http://spark.apache.org/docs/2.4.5/streaming-programming-guide.html#window-operations 在实际项目中&#xff0c;很多时候需求&#xff1a;每隔一…

数智未来,AI赋能——第四届OpenI/O 启智开发者大会昇腾人工智能应用专场圆满举行!

为提升启智社区与鹏城实验室在人工智能开源领域的影响力&#xff0c;促进社区成员与开源生态圈伙伴的合作。2月25日上午&#xff0c;第四届OpenI/O 启智开发者大会昇腾人工智能应用专场分论坛在深圳人才研修院举办&#xff0c;进一步促进与发挥企业间资源共通的优势&#xff0c…

【ROS2知识】关于colcon编译和ament指定

一、说明 这里说说编译和包生成的操作要点&#xff0c;以python包为例。对于初学者来说&#xff0c;colcon和ament需要概念上搞清楚&#xff0c;与此同时&#xff0c;工作空间、包、节点在一个工程中需要熟练掌握。本文以humble版的ROS2&#xff0c;进行python编程的实现。 二、…

【408之计算机组成原理】计算机系统概述

目录前言一、计算机的发展历程1. 计算机发展的四代变化2. 计算机元件的更新换代3. 计算机软件的发展二、计算机系统层次结构1. 计算机系统的组成2. 冯诺依曼体系结构3. 计算机的功能部件1. 输入设备2. 输出设备3. 存储器4. 运算器5. 控制器三、 分析计算机各个部件在执行代码中…

【算法】阿里面试题-编码实现20亿个整数,找出某个数X是否存在其中

1.海量数据去重-BitMap位图解决方案 需求&#xff08;面试题&#xff09; 一个32位4G内存的操作系统&#xff0c;在20亿个整数&#xff0c;找出某个数X是否存在其中 假如是java语言&#xff0c;int占4字节&#xff0c;1字节8位&#xff08;1 byte 8 bit&#xff09; 方式一&…

Mockito 入门

目录1.什么是 Mock 测试&#xff1f;2.Mockito简介3.在 SpringBoot 单元测试中使用 Mockito3.1 Maven依赖&#xff1a;3.2 UserService.java3.3 User.java3.4 thenReturn系列方法&#xff08;测试桩&#xff09;3.5 thenThrow系列方法3.6 verify 系列方法4.Spring中mock任何容器…

计算机组成原理-动态链接库-笔记

Linux 下的 ELF 文件格式 Windows 的可执行文件格式是一种叫作PE&#xff08;Portable Executable Format&#xff09;的文件格式 动态链接库 这些机器码必须是“地址无关”的。也就是说&#xff0c;我们编译出来的共享库文件的指令代码&#xff0c;是地址无关码&#xff08;…

10个可以实现高效工作与在线赚钱的 AI 工具网站

自 2020 年以来&#xff0c;内容开发领域已经感受到人工智能工具的存在。 目前&#xff0c;营销人员和内容创作者正在利用这些工具来加快他们的工作流程。 如果您拥有最流行的 AI 工具之一&#xff0c;例如 CopyAI、Jasper AI 或 Content at Scale&#xff0c;您可能正在考虑…

申论套卷 | 要点杂、乱、碎的材料如何快速分类整理?

试卷来源&#xff1a;2020年全国联考上半年材料1A省C市Y区文化馆&#xff08;非物质文化遗产保护中心&#xff09;作为政府设立的公益性公共文化事业单位&#xff0c;始终坚持公益文化发展方向&#xff0c;面向基层、贴近百姓、服务大众&#xff0c;积极组织各种大型活动&#…

Ubuntu中安装matelab2020a

Ubuntu中安装matelab2020a1 matelab下载2 安装步骤3 激活matelab4 创建快捷方式我的Ubuntu版本是20.041 matelab下载 matelab官网https://www.mathworks.com/ 点击右上角的get matelab&#xff0c;进入下载页面 没有账号的同学可以先去注册一个&#xff0c;推荐使用教育邮箱&…

错误: tensorflow.python.framework.errors_impl.OutOfRangeError的解决方案

近日&#xff0c;在使用CascadeRCNN完成目标检测任务时&#xff0c;我在使用这个模型训练自己的数据集时出现了如下错误&#xff1a; tensorflow.python.framework.errors_impl.OutOfRangeError: PaddingFIFOQueue _1_get_batch/batch/padding_fifo_queue is closed and has in…

前端JS内存管理

JS内存管理 内存原理&#xff1a; 任何变成语言在执行的时候都需要操作系统来分配内存&#xff0c;只是有些语言需要手动管理分配的内存有些语言有专门来管理内存的方式 如 JVM 了解以上的概念之后&#xff0c;我们再来了解一下大致的内存周期 分配需要的内存使用内存在不使用…