编译共享库 linux gcc/g++ cpp

Posted

技术标签:

【中文标题】编译共享库 linux gcc/g++ cpp【英文标题】:Compile shared library linux gcc/g++ cpp 【发布时间】:2017-12-05 18:21:23 【问题描述】:

我已经成功编译并创建了一个共享对象,但我不确定它是否真正共享并链接/模拟到 DLL。你能告诉我它是否正确吗? 我有 shared.h、main.cpp、nameOfLib.cpp。

shared.h

#ifndef SHARED_H
   #define SHARED_H
   int helpingLib();
#endif

main.cpp

#include "shared.h"
#pragma once

int main()
 helpingLib();
 return 0;


nameOfLib.cpp

#pragma once
int helpingLib() return 20;

Console:
g++ -shared -fPIC nameOfLib.cpp -o renameTo.so
//create local var 
export $MY_LD_PATH = /home/student/Documents/Total/LinuxXlib/renameTo.so
g++ main.cpp -Wl,$MY_LD_PATH -o executable

首先,它是一个真正可共享的库吗? 即使在 nameOfLib.cpp 中使用复杂的 cpp 代码,它也能正常工作

【问题讨论】:

是的!如果您编写复杂的库,您可能希望控制导出符号的可见性:gcc.gnu.org/wiki/Visibility。 是的,它是真正共享的,当您执行代码时,ld-linux.so 将进行 mmap 系统调用以将您的库代码部分映射到您的进程虚拟内存中:内核会将文件加载到RAM 并将其映射到进程地址空间。然后,如果您使用您的库启动其他程序,ld-linux.so(elf 解释器)将再次要求内核映射此部分:内核不会将文件的第二个副本重新加载到物理内存中,它将使用已经加载的那个,只是产生一个到第二个进程的内存地址空间的新映射。 Oliv,你能否解释一下如何使用多线程共享库,以便运行 main() 的进程必须将共享库代码委托给下一个进程? 我不确定我是否理解了您的问题。但是据我所知,这是近似的,libpthread 使用clone 系统调用来创建新线程,因此每个线程都在相同的地址空间中运行。同一个进程的所有线程共享同一个动态符号表,以及同一个共享库的映射。所以如果你在一个线程中加载一个动态库,这个库将对其他人可见。 这正是我所需要的,谢谢 Oliv,顺便问一下,你从哪里得到所有这些信息?你能推荐一本书吗? 【参考方案1】:

我不确定它是否真的共享

是的。

你链接到这个共享库的命令行是错误的。改为这样做:

g++ main.cpp -o executable /home/student/Documents/Total/LinuxXlib/renameTo.so

【讨论】:

以上是关于编译共享库 linux gcc/g++ cpp的主要内容,如果未能解决你的问题,请参考以下文章

使用 dpc++ 从 sycl 程序创建静态或共享库

如何编译 cpp 然后将其链接到共享库

链接 Yaml-cpp 和 Armadillo 共享库的 CMake 项目

linux下使用gcc/g++编译代码时gets函数有错误

在 linux 中使用共享库执行二进制文件

无法链接到 OpenCV (Linux) 的共享库