首页 > 其他分享 >gcc 使用 与 选项 编译动态库

gcc 使用 与 选项 编译动态库

时间:2023-09-22 19:22:22浏览次数:49  
标签:选项 gcc mylib 路径 编译 shared 共享 链接

问题:-Wl,-rpath,/path/to/shared/lib将-rpath选项传递给链接器,告诉链接器在运行时搜索共享库时要搜索指定的路径/path/to/shared/lib 与 使用 -L 指定 lib 路径 有区别吗

 

是的,-Wl,-rpath-L选项在链接器中有不同的作用和用途:

  1. -L选项:用于指定在链接过程中搜索库文件的路径。当你使用-L选项时,编译器将在指定的路径中查找库文件,以便将它们链接到可执行文件中。这通常用于静态链接和动态链接过程中。

    例如,如果你有一个共享库mylib.so,并且它位于/path/to/shared/lib目录中,你可以使用-L选项指定这个路径,以便编译器可以找到它:

gcc -o myprogram myprogram.c -L/path/to/shared/lib -lmylib

 

 

  1. -Wl,-rpath选项:用于在可执行文件中嵌入一个运行时链接路径。这个运行时链接路径告诉系统在运行可执行文件时在指定的路径中搜索共享库。它并不影响链接过程中的库搜索,而是影响程序在运行时查找库文件的路径。

    例如,如果你希望程序在运行时能够找到共享库mylib.so,并且它位于/path/to/shared/lib目录中,你可以使用-Wl,-rpath选项将运行时链接路径嵌入到可执行文件中:

    bash gcc -o myprogram myprogram.c -Wl,-rpath,/path/to/shared/lib

总结来说,-L选项用于编译和链接过程中的库搜索路径,而-Wl,-rpath选项用于运行时链接路径,它们在不同的阶段起作用,用途不同。通常,使用-L选项更常见,因为它直接影响链接过程,而-Wl,-rpath选项用于特殊情况,例如,当你想要在运行时动态指定共享库路径时。

 

 

`gcc`编译器中的`-shared`和`-fPIC`选项分别用于创建共享库(动态链接库)时的编译和链接过程中的不同方面。下面分别解释这两个选项的含义:

1. `-shared`选项:
- 意义:`-shared`选项告诉`gcc`编译器生成一个共享库(动态链接库,也称为共享对象),而不是可执行程序。共享库可以被多个程序共享,而不是每个程序都复制一份代码。
- 用法:通常,你在编译共享库的源代码时使用`-shared`选项。例如:
```bash
gcc -shared -o mylib.so mylib.c
```
- 效果:这将编译`mylib.c`并生成一个名为`mylib.so`的共享库文件,其中包含可供其他程序动态链接的代码。

2. `-fPIC`选项:
- 意义:`-fPIC`选项表示"Position Independent Code",它告诉编译器生成位置无关的代码。这种代码可以在内存中的任何位置加载,这对于共享库是必要的,因为它们可以在不同的内存地址空间中加载。
- 用法:通常,你在编译共享库的源代码时使用`-fPIC`选项。例如:
```bash
gcc -shared -o mylib.so mylib.c -fPIC
```
- 效果:这将生成一个位置无关的共享库,使得它可以被多个程序加载到内存的不同地址空间中,而不会导致地址冲突或其他问题。

总之,`-shared`选项用于生成共享库,而`-fPIC`选项用于确保生成的共享库包含位置无关的代码,以便它可以被多个程序安全地加载和共享。这两个选项通常一起使用,但在某些情况下,你可能只需使用其中一个,具体取决于你的需求和编译环境。

 

第一个 无法找到 mylib  ld  错误

 

 

 

 

 

 c 编译动态库

 

 

 

CC = gcc
CFLAGS = -Wall

# 指定共享库文件路径
LIB_PATH = /path/to/shared/library

# 指定目标可执行文件
TARGET = myprogram

all: $(TARGET)

$(TARGET): myprogram.c
$(CC) $(CFLAGS) -o $@ $< -L$(LIB_PATH) -lmylib -Wl,-rpath,$(LIB_PATH)

clean:
rm -f $(TARGET)

 

成功 

 

标签:选项,gcc,mylib,路径,编译,shared,共享,链接
From: https://www.cnblogs.com/rebrobot/p/17723198.html

相关文章

  • 解决lombok编译报错
    解决lombok编译报错idea编译报错java:JPSincrementalannotationprocessingisdisabled.Compilationresultsonpartialrecompilationmaybeinaccurate.Usebuildprocess“jps.track.ap.dependencies”VMflagtoenable/disableincrementalannotationprocessing......
  • linux 中 find命令 -maxdepth 和 -mindepth 选项
     001、[root@pc1dir001]#lstest01test02ww.txtxx.map[root@pc1dir001]#tree.├──test01│  ├──cc.csv│  └──kk.txt├──test02│  ├──dirxx│  │  └──diryy│  │  ├──rr.ped│  │  └......
  • 编译 OpenCV 的 Python 依赖
    这一次编译OpenCV的Python依赖为了方便运行我们使用Docker进行编译,环境准备如下:系统依赖:Ubuntu18.04Python版本:3.6,Ubuntu18.04官方源安装的默认版本OpenCV版本:3.4.16,是目前3.x的最新版CMake版本:3.10GCC版本(含C++):7.5我们首先拉取并进入镜像:dock......
  • 在不用插件和断网的情况下怎么实现编译python?
    要在不使用插件和断网的情况下编译Python代码,您通常不需要进行编译,因为Python是一种解释型语言,它将代码逐行执行而不需要显式编译过程。然而,如果您希望将Python代码打包成一个独立的可执行文件以便于分发,您可以使用一些第三方工具,如PyInstaller、cx_Freeze或Py2exe,但这些工具在没有......
  • Cygwin 编译的动态库文件.dll.a
    前提Cygwin编译OpenSSL出来的有两种文件:libcrypto.a和libcrypto.dll.a,VS编译调用没有问题,运行卡住,暂时未解决测试代码#include<openssl/evp.h>intmain(intargc,char*argv[]){ EVP_MD_CTX*mdctx; mdctx=EVP_MD_CTX_new(); EVP_MD_CTX_init(mdctx); EVP_DigestInit(m......
  • zabbix 源码编译安装找不到mysql_config
    1.准备LNMP环境,2.下载并解压zabbix包:下载地址:https://sourceforge.net/p/zabbix/activity/?page=0&limit=100#5e836904f0d3473e24304e3d解压  tar-zxvfzabbix-4.0.33.tar.gz3.安装依赖:yuminstalllibxml2-develnet-snmp-devellibevent-develcurl-develpcre*4../configure......
  • uni-app 条件编译
    一、在某个平台编译 #ifdef 1.单个平台<!--#ifdef H5--> <!--#endif-->2.多个平台<!--#ifdefH5||APP-PLUS--><!--#endif-->3. js 中//#ifdefH5//#endif4. style 中/*#ifdefH5*//*#endif*/二、除了某平台均存在 #ifndef<!--#ifn......
  • typescript_typescript的下载与手动编译
    下载npminstall-gtypescript编译.ts文件为.js文件tsc./typescript/test1.ts上面这个命令会在test1.ts的所属目录中创建一个同名的test1.js文件......
  • nuitka 打包编译python3 脚本
    pipinstallordered-set#加速编译pipinstallnuitkapipinstallzstandard#onefile时压缩文件#打包命令python-mnuitka--mingw64--standalone--output-dir=out--show-progress--onefile--windows-disable-console--windows-icon-from-ico=1.ico--output-di......
  • Centos7 编译安装MySQL-5.6
       CMAKE编译安装编译命令make读取makefile里面的指令,编译程序,makefile文件里调用gcc命令去编译源文件cmake命令也是一个编译命令,用于一些跨平台的编译设置编译步骤编译安装需要下载源码包、可以定制化编译参数,路径等信息,缺点就是对新手不友好。 #编译参数如......