首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Linux/gcc上创建与pthreads和libstdc ++静态链接的共享对象?

在Linux/gcc上创建与pthreads和libstdc++静态链接的共享对象,可以按照以下步骤进行:

  1. 编写源代码文件,例如example.cpp
代码语言:cpp
复制
#include<iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;

void* printHello(void* arg) {
    cout << "Hello from pthread!"<< endl;
    return NULL;
}

int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, printHello, NULL);
    pthread_join(thread, NULL);
    return 0;
}
  1. 使用-c选项编译源代码文件为目标文件:
代码语言:bash
复制
g++ -c example.cpp -o example.o -pthread -static-libstdc++

其中,-c选项表示只编译源代码文件,不进行链接;-o选项表示指定输出文件名;-pthread选项表示链接pthreads库;-static-libstdc++选项表示静态链接libstdc++库。

  1. 使用-shared选项将目标文件链接为共享对象:
代码语言:bash
复制
g++ -shared example.o -o example.so -pthread -static-libstdc++

其中,-shared选项表示生成共享对象文件;-o选项表示指定输出文件名。

完成以上步骤后,example.so即为与pthreads和libstdc++静态链接的共享对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux下动态库(.so)和静态库(.a) 区别

linux下有两种库:动态库和静态库(共享库) 二者不同点在于代码被载入时刻不同。 静态代码在编译过程中已经被载入可执行程序,因此体积比较大。...静态动态库最大区别,静态情况下,把库直接加载到程序中,而动态库链接时候,它只是保留接口,将动态库程序代码独立,这样就可以提高代码可复用度,降低程序耦合度。...例如将libd2.so换成libd.so 显式调用动态库 显式调用动态库,编译时无需库文件,执行时动态可存储于任意位置,库里共享对象必须先申请后使用,不同动态库版本,只要其共享对象接口相同,就可以直接动态加载...总结: 编译静态库时先使用-c选项,再利用ar工具产生.编译动态库方式依不同版本UNXI而定。隐式调用动态库静态用法相一致,而显示调用动态库则需要借助动态加载共享库函数族。...隐式调用动态库和静态库使用方法一致,使用静态使用动态库编译成目标程序使用gcc命令完全一样,那当静态动态库同名时,gcc命令会使用哪个库文件呢?

16.6K21

Linux系统编程】Linux编译器——gccg++使用 及 动态库和静态认识

概念 我们先来简单了解一下它们概念: gcc (GNU Compiler Collection) g++ 是 Linux 系统最常用编译器。它们是 GNU 组织开发一套开源编译器工具集。...gcc g++ 选项基本都是一样,我们这里就重点以gcc为例来进行讲解。 2. gcc 使用 通过上面的了解我们知道gcc g++ 其实就是Linux系统编译器。...大家思考一个问题,为什么我们在Linux可以进行C/C++代码编译链接这些动作呢?...其实其中一个比较重要原因就是Linux提供了这些语言所需要开发库,标准C库(libc)、标准C++库(libstdc++)以及其他各种系统库第三方库。...不过呢,一般我们Linux默认只有动态库,所以,如果想进行静态链接的话,需要先安装一下静态库: yum install -y glibc-static libstdc++-static 把指令给大家

65310

关于gcc、glibcbinutils模块之间关系

它主要完成工作任务是“预处理”“编译”,以及提供了编译器紧密相关运行库支持,libgcc_s.so、libstdc++.so等。...2、binutils提供了一系列用来创建、管理维护二进制目标文件工具程序,汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信息符号工具...(14)nis (15)stdlib,其它基本功能 二、在现有系统如何升级 1、升级这些库时,最好不要覆盖系统中缺省;因为这些库,尤其是glibc库,是系统中最核心共享工具,如果盲目覆盖,很可能导致整个系统瘫痪...3、修改gccspec文件(/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs),更改ld-linux.so.2为/usr/local/lib下共享库装载器.../ Linux平台gcc动态共享基础知识

2.4K91

cmake:动态链接库(so)中静态链接tcmalloc(gperftools2.4)暨静态链接libstdc++

但是凡事有利就有弊,这个方案带成本就是在系统安装、维护时稍显复杂:需要在服务器安装tcmalloclibunwind(应用系统运行在64位操作系统下),还可能需要修改tomcat启动脚本以加入LD_PRELOAD...于是我觉得用静态链接方式将tcmalloc编译到so库中比较好,这样这个动态库以比较独立方式发行,不再依赖系统中是否安装了tcmalloclibunwind。...下面是我CMakeLists.txt中关于静态连接tcmalloclibstdc++代码。...(so代码是以C++11写,所以还要依赖于libstdc++库,所以我打算把libstdc++库也以静态方式连接到程序中) ##判断操作系统类型 if(CMAKE_SYSTEM_NAME MATCHES...(关于-fPIC参数,这个文章讲得挺详细《译链接问题 gcc -fPIC -shared》),解决这个问题方法也大同小异,就是根据这个错误提示用-fPIC参数重新编译相关库,这里是就是指要重新编译

1.8K10

Linux动态链接

最近又有一次碰到类似的问题,所以顺便把动态链接基本原理了解了一遍。 静态链接 静态链接库,在Linux下文件名后缀为.a,libstdc++.a。在编译链接时直接将目标代码加入可执行程序。...命名规则 动态链接应用程序之间真正链接是在应用程序运行时,因此很容易出现开发环境运行环境动态链接库不兼容或缺失情况。 Linux通过规定动态链接版本命名规则来管理兼容性问题。...libstdc++.so.6.0.21发布版本号是21。...* libstdc++.so.6.0.21* libstdc++.so:linker name,程序编译链接时如果依赖了共享库,链接器只认不带任何版本共享库。...libstdc++.so.6.0.21:real name,这是动态链接真正名称。 相关路径 /lib:最关键基础动态链接库。 /usr/lib:关键动态链接库。

5K91

Linux下库文件制作方法详解

大家好,继上节,这节我们继续讲解如何在Linux系统创建我们需要库文件 在创建程序库之前,需要先来了解GCC一些参数,因为静态共享库需要GCC工具产生,并且两者GCC参数不同...目标文件需要创建成位置无关码,概念就是在可执行程序装载它们时候,它们可以放在可执行程序内存里任何地方 -shared 生成动态链接库 我们编写两个函数并将文件制作成库文件,用下面相同代码分别制作静态共享库...动态加载需要用到系统API函数 接口 描述 dlopen 打开对象文件,可被程序访问 dlsym 获取执行了dlopen函数对象文件中符号地址 dlerror 返回一次出现错误 dlclose...-o main-dl main-dl.c -ldl -ldl 表明将 dllib 链接于该程序,即可调用DLAPI 共享库文件放置与共享库调用时操作一样 结束语 到目前为止,我们详细讲解了Linux...下制作静态库、共享库、以及动态加载库,希望通过此文对你在Linux认识有所帮助,那么目的就达到了

2.1K30

LinuxLinux 编译器调试器 -- gccg++gdb 使用

文章目录 一、Linux编译器 - gcc/g++ 使用 1、程序运行四个阶段 1.1 预处理 1.2 编译 1.3 汇编 1.4 链接 2、链接方式函数库 2.1 动态链接静态链接 2.2...动态库静态库 3、gcc/g++ 使用 二、Linux调试器 - gdb 使用 1、debug release 2、gdb 使用 一、Linux编译器 - gcc/g++ 使用 1、程序运行四个阶段...注:gcc 预处理编译链接三个阶段对应选项和文件后缀有一个记忆技巧 – ESc iso,其中 ESc 分别代表 -E -S -c,iso 分别代表 .i,.s,.o;ESc 可以对比电脑 [Esc...,在Linux下其后缀名为 “.a”,在Windows下其后缀名为 “.lib”; 动态库也被称为共享库,它与静态库相反,在编译链接时并没有把相应库文件代码加入到可执行文件中,而是在程序执行时由运行时链接文件来加载库...gcc/g++ 安装 在Linux下,我们可以使用如下指令来安装 gcc g++: sudo yum install -y gcc yum install -y gcc-c++ libstdc++

1.5K00

安装pythonvisual模块时报错

...检查对象文件后缀... o检查我们是否正在使用GNU C编译器...是检查gcc是否接受-g ...是检查gcc选项是否接受ISO C89 ...不需要检查make使用include样式......GNU检查gcc依赖样式... gcc3检查如何运行C预处理程序... gcc -E检查生成系统类型... i686-pc- linux-gnu检查主机系统类型... i686-pc-linux-gnu...(已缓存)是,检查gcc链接器(/ usr / bin / ld)是否支持共享库...是,检查-lc是否应该被显式链接...不检查动态链接器特征......GNU / Linux ld.so检查如何将库路径硬编码到程序中...立即检查是否可以剥离库...是的,请检查libtool是否支持共享库。.....是的,检查是否要建立共享库...是,检查是否要构建静态库...是,检查构建环境是否正常...是,是否检查是否启用Makefile维护者特定部分...不检查Win32 ...不检查pkg-config

2.3K10

Linux开发工具——gcc

✈️ 历史遗留问题(普通用户sudo)   我们之前在 Linux权限详解 里面,遗留了一个问题,刚创建普通用户是不能进行 sudo 操作。...✈️ 动静态库   我们在使用gcc进行编译最后一步链接时,会按照系统默认路径 “user/lib” 下进行查找,也就是生成 .o 文件库文件 libc.so.6 进行链接。   ...2、静态函数和数据在可执行文件中是静态.o文件进行 静态链接 3、静态大小会增加可执行文件大小,因为库代码会被完整地复制到可执行文件中。...动态库工作状态: 1、在编译时,动态库目标文件(.o文件)会被编译成共享对象文件(.so文件)。 2、动态库函数和数据在运行时才会被加载到内存中。...3、动态库使用需要运行时加载链接过程,因此执行速度相对较慢。 4、动态库可以被多个可执行文件共享,节省了系统资源。

12810

cmake链接静态库-static-libstdc++问题

在嵌入式平台中,业务使用C语言开发,在交叉编译过程中会链接一个第三方c++静态库,该第三放库使用了std,需要链接libstdc++库,由于所在嵌入式平台中没有libstdc++.so库,如果将libstdc...++.so拷贝板子,需要占用5MB空间,很浪费空间,准备使用libstdc++静态库,在链接过程中出现如下问题;   整个业务编译使用cmake构建,使用如下方式进行链接; add_executable...} ${src_sample}) target_link_libraries(${target}  -lstdc++) 可以编译成功,但此时链接是stdc++动态库,预期相违背; 经过漫长资料查阅终于找到原因...: gcc链接说明: https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options -static-libstdc++ When...'lstdc++'是gccg++都能识别,但是'-static-libstdc++'只有g++可以识别,而我业务代码都是使用C语言编写,在链接时cmake默认使用gcc,但是gcc不能识别'-

5.8K51

Linux操作系统】程序编译静态链接

(动静态)链接 1.动态链接 2.静态链接 3.静态链接下载安装 4.windows下动静态后缀 一.编译 写在前面 编译这整个过程都只是在编译你自己写代码,直到链接才让你代码代码关联起来...(动静态)链接 链接目的:把自己写并且编译好二进制代码库里二进制代码关联起来,形成可执行程序!...gcc test.c -o test//Linux-默认是动态链接链接方式 file 可执行程序 ldd 可执行程序 //在linux中, ldd是list dynamic dependencies缩写...静态链接方式 3.静态链接下载安装 动态库一般系统自带,因为系统运行时需要用到动态库 静态库在Linux中一般要自行安装 sudo yum install glibc-static//安装C...静态库 sudo yum install libstdc++-static//安装c++静态gcc test.c -o test -static//生成静态程序test 4.windows下动静态后缀

1.2K30

认识目标文件格式——a.out COFF PE ELF

1.目标文件常用格式 目标文件是源代码编译后未进行链接中间文件(Windows.objLinux.o),可执行文件(Windows.exeLinuxELF)结构内容相似,因此跟可执行文件采用同一种格式存储...除此之外,还有些不常用目标文件可执行文件格式,比如IntelMicrosoft以前使用对象模型文件(OMF,Object Module File)、Unix最初使用a.outMS-DOS...不光是可执行文件按照可执行文件格式存储,动态链接库(DLL,Dynamic Linking Library)(Windows.dllLinux.so)及静态链接库(Static Linking Library...LinuxELF文件主要有如下几种: ELF文件类型 说明 实例 可重定位文件(Relocatable File) 包含了代码数据,可以用来连接成可执行文件或共享目标文件,目标文件静态链接库...Linux.o.a,Windows.obj.lib 共享目标文件(Shared Object File) 包含了代码和数据,主要有两种用途,一是目标文件或其它共享目标文件链接成新共享目标文件

2.9K30

Linux静态动态库

Linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.…硬链接指向目录。...一、动态库和静态库 具体动态库和静态相关内容点击跳转 Linux库一般分为动态库和静态库: 静态库(.a):库文件以.a为后缀,程序在编译链接时候把库代码链接到可执行文件中。...程序运行时候将不再需要静态库 动态库(.so):库文件以.so为后缀,程序在运行时候才去链接动态库代码,多个程序共享使用库代码。...链接本质:无非就是我们调用库函数时候标准库是如何关联问题 库名称:去掉前缀lib去掉后缀.so/.a剩下就是库名称,比如libc.so就是C库 gcc 在编译时默认使用动态链接,而生成静态链接...---- 四、制作动态库 首先我们需要把库文件全部编译成.o文件,这里静态库不同,需要带上选项 -fPIC,形成位置无关码: gcc -c -fPIC my_add.c 什么是位置无关码目标二进制文件

26130

oracle9i for linux A

正式安装 一、oracle9i 安装盘oracle9i 补丁 ship_9204_linux_disk1.cpio p3006854_9204_LINUX.zip ship_9204_linux_disk2....cpio p2617419_210_GENERIC.zip ship_9204_linux_disk3.cpio p3238244_9204_LINUX.zip 二、安装步骤 1、以根用户登录系统,添加安装过程中需要用到用户组...注意:如果你共享内存不够大的话,在安装过程中会提示ORA-27123错误,到时候你只要把/proc/sys/kernel/shmmax值调大就可以了 3:以root用户在根目录底下创建oracle...compat-gcc-c++-7.3-2.96.122.i386 compat-libstdc++-7.3-2.96.122.i386 compat-libstdc++-devel-7.3-2.96.122...rpm 安装方法,将CD3放入VMWARE光驱 mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom cd /RedHat/RPM rpm -ivh 包名 一般情况下,你系统输出结果这个不同

5K20

程序生成之编译、链接、加载浅析

编译 输入对象:程序源码 输出目标:目标文件 工具:编译器 PC机常用编译器为gcc,ARM常用编译器为arm-linux-gcc 编译过程又可以被分为两个阶段:编译、汇编。 1....目标文件 生成目标文件一般为下列三种: 可重定位(Relocatable)目标文件:由编译器汇编器生成,可与其他可重定位目标文件合并,创建一个可执行或共享目标文件; 共享(Shared)目标文件:...静态链接库实际是一个目标文件集合,其中每个文件含有库中一个或者一组相关函数代码。...为了创建可执行文件,链接器必须完成任务是: 符号解析:把目标文件中符号定义引用联系起来; 重定位:把符号定义内存地址对应起来,然后修改所有对符号引用。...动态链接器(ld-linux.so)链接程序在运行过程中,根据记录共享对象符号定义来动态加载共享库,然后完成重定位。在该可执行文件被执行时,动态链接全部内容被映射到运行时相应进程虚地址空间。

1.1K60

详解共享动态加载

在本文中,我将尝试解释在Linux系统中动态加载共享内部工作原理。 这边文章不是一个如何引导,尽管它确实展示了如何编译调试共享可执行文件。为了解动态加载内部工作方式进行了优化。...一般来说,库非常有用,因为它们可以缩短编译时间(在编译应用程序时不必编译依赖关系所有源代码)模块化开发过程。 静态链接到已编译可执行文件(或另一个库)中。编译后,新组件将包含静态内容。...编译链接动态可执行文件 首先,我们将为main.cpp创建一个共享对象: $ clang++ -o main.o -c main.cpp 之前完全相同random.o。...要回答这些问题,我们将不得不更深入地研究这些文件结构。 ELF - 可执行链接格式 共享可执行文件格式称为ELF(可执行链接格式)。...libstdc++: 标准C++库 libm: 包含基本数学函数库 libgcc_s: GCC(GNU编译器集合)运行时库 libc: C库:它定义了系统调用其他基础设施库open,malloc,

3K20

Linux】软硬链接静态

环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅  相关文章: 【Linux】动静态库以及动静态链接Linux】基础IO_文件系统 软硬链接...接下来,我们通过下面指令来给mysoft文件,创建链接: ln -s mysoft mysoft-s  我们发现,创建出来链接文件inode编号源文件并不相同,并且,软链接文件大小远远小于源文件大小...如何制作和使用第三方库 第一方库:语言提供库(c/c++标准库) 第二方库:操作系统提供 第三方库:other提供,比如我们接下来自己制作静态静态打包 静态打包主要分为两个步骤: 将存放方法源文件进行编译...动态库打包 上面讲了静态打包使用,接下来将动态库打包使用,以及动态库链接原理。...y libstdc++-static 另外,我们需要知道以下几点: gcc/g++默认采用动态链接,但是假如只存在静态库,则gcc/g++只会进行静态链接,同样,只存在动态库,也只能进行动态链接(即使我们加上

18730

【一站式解惑】Linux中.a、.so.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

进行动态链接实际也使用了静态链接来实现 ),一个是DLL文件,引入库文件包含被DLL导出函数名称位置,DLL包含实际函数和数据,应用程序使用LIB文件链接到所需要使用DLL文件,库中函数和数据并不复制到可执行文件中...DLL内函数分为两种 (1)DLL导出函数,可供应用程序调用; (2)DLL内部函数,只能在DLL程序使用,应用程序无法调用它们 创建静态链接创建动态链接库 (1)VC6中创建[Win32 Dynamic-Link...在Linux下,共享加载是由/lib/ld.so完成,ld.so加载共享库时,会从ld.so.cache查找。 创建函数库示例 我们通常把一些公用函数制作成函数库,供其它程序使用。...动态库在程序编译时并不会被链接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本节主要通过举例来说明如何在Linux创建静态动态库,以及使用它们。...程序照常运行,静态库中公用函数已经链接到目标文件中了。 我们继续看看如何在Linux创建动态库。我们还是从.o文件开始。

4.1K52
领券