编译共享库 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的主要内容,如果未能解决你的问题,请参考以下文章