首页 > 编程语言 >使用g++对c++进行编译链接

使用g++对c++进行编译链接

时间:2024-07-04 15:52:22浏览次数:20  
标签:++ c++ mylibdir 编译 so libmy 动态 静态

静态库

  1. 静态库的生成
    静态库实际就是多个.o的归档(文件夹)
  //在bash终端执行依次执行以下g++命令.
  
  g++  -c src1.cpp src2.cpp
     
  ar crv libmy.a src1.o src2.o

查看静态库内容:

  //输出src1.0,src2.0,这也验证了静态库.a文件实际就是个归档目录
  ar -t libmy.a
  1. 静态库链接
g++ -I./mylibdir -L./mylibdir -lmy -o out1

//-lmy优先匹配mylibdir目录下的动态库libmy.so
//如果mylibdir目录下的动态库libmy.so和静态库libmy.a都存在
//则应该通过-l:libmy.a进行精确指定
g++ -I./mylibdir -L./mylibdir -l:libmy.a -o out1

动态库

//-shared -fPIC生成与位置无关的动态库
g++ -shared -fPIC src1.cpp src2.cpp -o libmy.so

//等价下面两步:
//有别于静态库,这里必须指定-fPIC,以生成位置无关的代码(.o)
g++  -c -fPIC src1.cpp src2.cpp
//-shared:位置无关的.o整合成一个动态库文件
g++ -shared srcfile1.o srcfile2.o -o libmy.so

2.动态库链接:

g++ -I./mylibdir -L./mylibdir -lmy -o out2
  1. ldd查看可执行文件(运行时)依赖哪些动态库?
//out2可以看到依赖动态库libmy.so
ldd out2
//out1使用的是静态库libmy.a。不依赖动态库
ldd out1
  1. 可执行文件运行时找不到相应动态库?
//执行out2,报“找不到libmy.so或libmy.so未定义”
./out2 

原因:
g++ -I./mylibdir -L./mylibdir -lmy -o out2中是编译时链接,对动态库而言这只是确保了可执行文件能编译通过。
还需指定动态库的运行时路径:

1, 编译代码中指定的动态库搜索路径(-rpath)
2, 环境变量LD_LIBRARY_PATH中指定的搜索路径。
3, 配置文件/etc/ld.so.conf中指定的搜索路径。
4, 默认的搜索路径/lib, /usr/lib/

g++ main.o libtest.so -Wl, -rpath=/path/to/libs/

另外也可以设置LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libs/

标签:++,c++,mylibdir,编译,so,libmy,动态,静态
From: https://www.cnblogs.com/cppisshit/p/18281627

相关文章

  • i++ 与 ++i 的区别
    packagetmp;publicclassTest{publicstaticvoidmain(String[]args){f1();f2();}privatestaticvoidf2(){inti=0;intj=++i;System.out.println(j);}privatestaticvoidf1(){inti=0;intj=i++;System......
  • C++单例模式、工厂模式、观察者模式等的实现和应用场景。
    设计模式是软件开发中常用的解决方案,它们提供了一些经过验证的方法来解决常见的设计问题。以下是单例模式、工厂模式和观察者模式在C++中的实现和应用场景的详细讲解。1.单例模式(SingletonPattern)概念单例模式确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。......
  • 多线程编程的基本概念,C++标准库中的多线程支持(std::thread,std::async),如何处理线程同步
    多线程编程在现代计算机系统中非常重要,因为它能够使程序同时执行多个操作,提高计算效率。以下是多线程编程的基本概念及如何在C++标准库中使用std::thread和std::async进行多线程编程,同时处理线程同步和并发问题。多线程编程的基本概念线程(Thread):线程是一个轻量级的进程,是......
  • 用C++解决编程题目:求特殊自然数
    学习目标:用C++编写简单的程序学习内容:#include<iostream>usingnamespacestd;intmain(){ inta,b,c; for(a=1;a<7;a++){ for(b=0;b<7;b++){ for(c=1;c<7;c++){ if(a*7*7+b*7+c==c*9*9+b*9+a){ cout<<a*7*7+b*7+c<<endl; cout<......
  • 分别使用CMAKE和CLION编译,同一个cmakelists.txt, 为什么clion出错和cmake正常?clion出
    求助!!我在github上找到了一个大型的应用软件的开源代码,使用CMAKE编译,再用VS2017以生成应用程序。因为想改代码,所以使用了CLion在本地运行。但是cmake能够正常通过的文件代码,clion却出错。用的同一个cmakelists.txt,请问为什么clion出错和cmake正常呢?求求~改动了很久cmakelist......
  • C/C++ 比较运算的注意事项
    C/C++中比较运算是一个基础且重要的概念,它用于比较两个或多个表达式的值,并返回一个布尔结果(在C/C++中以整数形式表示,真为1,假为0)。以下是一些关于C/C++比较运算的注意事项:1.比较运算符C/C++中的比较运算符包括:==(等于)!=(不等于)<(小于)>(大于)<=(小于等于)>=(大于等于)这......
  • 编译elementUI主题scss
    elementVue2工程1. 安装包"gulp":"^4.0.2","gulp-autoprefixer":"^8.0.0","gulp-minify-css":"^1.2.4","gulp-sass":"^4.0.2","gulp-uglify":"^3.0.2",2.......
  • Linux下编译Azerothcore源码
    前言终于开始介绍Linux下如何编译AzerothCore源码了,本文编译和架设方法较为繁琐和细致,含Ubuntu、Debian和Docker(相较之前的Docker教程来说本文是手动版),且涉及到搭建注册网站和对外开放服务部分,故再次声明:本网站均为技术研究,若参考本网站教程搭建对外服务,我均不负任何责任!系统环......
  • Docker编译Azerothcore源码
    维基百科Docker是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟......
  • 汽车站车票管理系统(C++版)
    设计要求程序菜单功能一个汽车站每天有n班通往各地的车,每班车都有唯一的车次号(00100,00101,00102,…),发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量等信息。每班车信息如下:表1.汽车站汽车数据库列表车次                    ......