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

这篇具有很好参考价值的文章主要介绍了Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


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

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

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

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

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

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

最终效果如下图:

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

 然后根据自己的项目需求写好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" 这样使用)

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

-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 的大写) :指定头文件的所在的目录,可以使用相对路径。在代码中使用头文件可以不用指明具体路径。

例如:

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


再次提醒注意:

如果动态库和静态库名字一样,例如: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

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

 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

此时会发现报错:

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

 
解决方案:

在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_

再一次去编译运行:

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

问题完美解决了!

c++可以调用c写的库了。文章来源地址https://www.toymoban.com/news/detail-473823.html

到了这里,关于Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux下gcc编译,动态库和静态库,makefile,gdb调试

    展开头文件, 宏替换(变量宏、函数宏)、替换空格等 逐行检查程序中出现的语法错误,简单的逻辑错误 将 .s 汇编文件中所有的汇编指令翻译成二进制机器码(下面就是来了个截图,二进制显示了乱码) 将 .o 的目标文件,链接库文件、数据段合并,地址回填(把汇编里相

    2024年02月08日
    浏览(48)
  • 在linux上使用C++调用动态链接库.so文件(输入两个参数)

    在新服务器上已经实现了用Python调用.so文件,现在尝试C++接口, 使用c++编写和使用.so动态链接库_51CTO博客_c++动态链接库 参考这个人的调用函数Linux C++简单生成与调用so库_秦小乙的工作台的博客-CSDN博客 记录在C++里面调用linux的地址直接写绝对路径就可以,不用双斜杠:stri

    2024年02月08日
    浏览(48)
  • 【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识

    这篇文章我们继续学习Linux中的开发工具,今天要学的是: Linux下的编译器——gcc/g++ 我们先来简单了解一下它们的概念: gcc (GNU Compiler Collection) 和 g++ 是 Linux 系统上最常用的编译器。它们是 GNU 组织开发的一套开源编译器工具集。 gcc: gcc 是 GNU 编译器集合中的 C 语言编译器。

    2024年02月16日
    浏览(40)
  • QT 链接动态库 (静态链接 条件编译 动态加载)

    本篇文章以我实际使用过程为例,在此总结一下qt链接动态库的几种方式 使用的动态库为libzint.so,库目录为/usr/local/lib 第一种为直接将库添加到QT中,可以看成静态库 通过pro文件添加链接 在用到外部库的程序代码中直接 这样就可以直接调用外部库的中结构体与函数接口 可以

    2024年01月20日
    浏览(46)
  • 【探索Linux】—— 强大的命令行工具 P.13(文件系统 | 软硬链接 | 动态库和静态库)

    在计算机科学领域中,Linux 系统一直以来都是备受推崇的操作系统之一。其中,文件系统、软硬链接、动态库和静态库是 Linux 系统中非常重要的概念,在实际应用中扮演着不可或缺的角色。 在上一篇文章中,我们了解了 Linux 系统中文件描述符、重定向以及基础 IO 操作的相关

    2024年02月04日
    浏览(50)
  • 鸿蒙加载第三方动态链接库(.so)文件

    在没有正确引用so文件情况下会报出上述错误,正确姿势应该如下 在Android的写法是在main目录下创建jniLibs,然后.so文件复制进去即可,但是在鸿蒙里面要在libs/内放置arm64-v8a和armeabi-v7a两个文件夹的so文件,然后在build.gradle文件 加多一个.so的描述 即可使用

    2024年02月13日
    浏览(34)
  • linux 动态链接库(.so)的生成和引用

    一.简介 动态链接库:在Linux系统中,动态链接库(Dynamic Linking Library)是一种在运行时链接的共享库。相比于静态链接库,动态链接库可以在程序运行时加载,而不需要在编译时链接到程序中,这样可以减小可执行程序的大小,也方便了库的管理和更新。 动态链接库有两个主

    2024年02月14日
    浏览(40)
  • Linux的编译器——gcc/g++(预处理、编译、汇编、链接)

    前言: 本文主要认识与学习 Linux 环境下常用的编译器—— gcc (编译 C 代码)/ g++ (编译 C++ 代码)的常用指令等、程序实现的两大环境、动态库与静态库的理解等。 任何一个 C 程序的实现都要经过 翻译环境 与 执行环境 。 在翻译环境中又分为4个部分, 预编译、编译、汇

    2024年02月13日
    浏览(43)
  • 【Linux】Linux编译器 gcc 的使用 | 动静态库的初步认识

    👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:Linux

    2024年01月15日
    浏览(35)
  • 【Linux】认识Linux下的编译器gcc/g++ | 认识动静态库

    本文思维导图: 🍉博主主页:@在肯德基吃麻辣烫 我们知道,sudo指令后面紧跟的一条指令,该条指令是以root身份执行的对于有一些我们普通用户无法执行的指令,就需要用到该指令进行提权。 sudo + 指令 功能:以管理员身份执行该条指令 比如: sudo touch mycode.c 然而我们执行

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包