Articles of 共享库

将Nginxbuild成库

我想build立一个静态库(最好)的nginx,但一个DLL也可以工作。 有没有人试过这个? 目前,我没有build立好运气,试图使用lib.exe将.objs构build到lib中,但是当我尝试使用该库时,每个函数都会得到未parsing的外部对象。 我也尝试创build一个DLL从-MT到-LD更改CFLAGS,使用__declspec(dllexport)将主要包装到导出的函数中,但是当我尝试启动nginx主时,出现Access Violation错误。 任何提示,将不胜感激。 我工作的平台是Windows。

为什么我的程序试图使用libluajit-5.1.so.2而不是libluajit.so?

我有一个使用LuaJIT的项目。 我试图在一台计算机上运行我的项目,我还没有在一段时间内运行它。 它曾经运行得很好,但现在当我尝试运行它抱怨。 我在我的源代码树中有LuaJIT,而且构build得很好。 我正在使用CMake生成我的make文件,并且据我所知,CMakefind文件libluajit.so,但是当我运行我的程序时,出现以下错误: ../build/game/game: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory 我不知道为什么它正在寻找该库的版本,而不是libluajit.so。 这是Ubuntu Linux的价值。 我可以添加更多的细节,如果有必要,我可以添加更多的细节,如果有必要,我不知道什么信息将有助于弄清楚发生。 编辑: 要build立和链接程序,我将这些行放在文件CMakeLists.txt (这只是简单地显示相关位) find_package(LuaJIT REQUIRED) set(Extern_LIBS luajit) add_executable(proj ${proj_Sources}) target_link_libraries(proj ${Extern_LIBS}) 在我的源代码目录上运行cmake后,运行make 。 然后运行它,我只是运行./proj

关于这种情况下消息队列与共享内存的适用性或适用性

这是关于在这种情况下消息队列与共享内存的适用性或适用性: 多个DLL或共享库 每个库将尝试与我的主应用程序DLL或共享库进行通信,例如,所有DLL或共享库的I / P到O / P将通过我的主应用程序的共享库进行通信。 这些通信是asynchronous的。 一些DLL或共享库,除了我的应用程序的.so,将创build多个线程,每个这样的线程的输出需要传回到我的应用程序库。 这些线程的输出又是asynchronous的。 我的主要应用程序DLL / .so将继续与其他工作,这很可能是通过networking与一些服务器通信,并作出相应的响应 所有其他DLL / .so的function是asynchronous的 Q-1:在上述哪种情况下最合适? (I)消息队列,(II)共享内存? Q-2:使用共享内存在几个共享库之间强制同步的任何引用或链接?

如何从Linux上的.so文件中获取C ++类?

我正在使用ACE库来做一些反应器工作。 在linux上,默认的ACE编译输出是libACE.so。 我通常使用-lACE编译选项来编译它,但这取决于我是否已经在ld.so.conf.d目录中configuration了libACE.conf。 如果我想子类ACE_Task,可以从ACE.so导入,编译依赖于libACE.so,如果我想dynamic加载ACE.so,我该怎么做? 我试过了,如果我使用dlopen,那么会出现链接错误。 那么,有没有办法dynamic加载ACE.so,仍然可以像这样实现ACE_Task? class test: public ACE_Task<ACE_MT_SYNCH> { }

Linux共享库中全局variables的单个拷贝

这个问题与这个问题非常相似,但是没有提到的解决scheme是有帮助的。 假设我有一个使用本地全局variables的函数的共享库B. 这个函数是从第二个共享库C中调用的 B和C都被A使用,我期望每个都有它自己的全局variables实例,但不知何故,编译器设法将它们链接到指向相同的对象(与Windows不同)。 有人可以提出一种方法,让我有不同的全球变数的实例在A? 以下是我的代码。 运行a.out时,我希望得到 1 calling from someCFunc(): 1 但是,我得到: 1 calling from someCFunc(): 2 BH: #ifndef _B_H_ #define _B_H_ extern "C" __attribute__ ((visibility("default"))) void myFunc(); #endif b.cpp: #include "bh" #include <iostream> int myGlobal = 0; extern "C" __attribute__ ((visibility("default"))) void myFunc() { ++myGlobal; std::cout << myGlobal << "\r\n"; } CH: #ifndef […]

Linux上的MATLAB MEX文件无法在libpython.2.7.so中find符号

我一直在做一个项目 ,使用libpython2.7.so将Python解释器作为MEX文件embedded到MATLAB中,但每当我尝试导入作为扩展模块实现的Python模块时遇到问题。 例如,试图导入itertools导致以下错误: >> py_import itertools ImportError: /usr/lib64/python2.7/lib-dynload/itertoolsmodule.so: undefined symbol: PyTuple_Type ??? Error using ==> pymex_fns Python exception inside py_import. Error in ==> py_import at 24 py_obj = pymex_fns(py_function_t.IMPORT, name); 无论是否在调用Py_Initialize()之前清除LD_LIBRARY_PATH ,并且在MATLAB中调用ldd (对于itertools.so ,在本示例中)不会导致任何(not found)消息,都会发生此问题。 下面我粘贴运行MATLAB的结果, LD_DEBUG=libs set,首先用MATLAB启动时设置的LD_LIBRARY_PATH ,然后在尝试导入之前运行setenv('LD_LIBRARY_PATH', '') 。 我怎样才能解决这个问题,并允许dynamic加载扩展模块? 使用MATLAB的默认LD_LIBRARY_PATH : >> py_import itertools 3018: find library=libpython2.7.so.1.0 [0]; searching 3018: search path=/usr/local/MATLAB/R2011a/bin/glnxa64/../../bin/glnxa64:/usr/local/MATLAB/R2011a/bin/glnxa64:/usr/local/MATLAB/R2011a/bin/glnxa64/../../sys/os/glnxa64 […]

dynamic加载(DL)库和第一条指令

是否可以使用c中的dynamic加载(DL)库来检索库的第一个指令的地址? 换句话说,我想知道从哪里加载库的地址。

Linux共享库:replace符号运行时

我有一个相当大的C应用程序组成的几个共享库。 其中一个核心库有一个function void common_function(const char * arg) { … } 这是所有其他库调用。 在testing过程中,我想使用common_function的不同testing实现。 我的计划是创build一个包含common_function的替代实现的testing库; 是不是可以用dlopen() / dlsym()这个common_functionreplace默认的common_function运行时,或者是这个连接线: gcc -o test.c -ltest -lcommon 确保libtest.so中的common_function实现也在libcommon.so中使用 – 尽pipe后者有自己的common_function实现。

了解Linux中的dynamic库加载

我想从这里[1]理解dynamic库在Linux中的加载,并想澄清这个概念。 具体地说,当一个dynamic库被加载到Linux环境的一个进程中时,它被加载到地址空间中的任何一点。 现在,一个库有一个代码段和一个数据段。 代码段的地址没有被定义为预先链接,所以它是0x0000000,而对于数据段,一些编号被定义为一个地址。 但是这里有个诀窍,这个数据段的地址实际上并不是真正的地址。 实际上,无论在哪个位置加载代码段,都会将数据段的预定义地址添加到其中。 我在这里纠正? 还有一件来自引用的文章。 这个说法是什么意思? 但是,我们有一个约束,即共享库在每个进程中仍然必须有一个unqiue数据实例。 尽pipe可以在运行时将库数据放在任何地方,但是这需要留下重定位来修补代码,并通知它在哪里实际查找数据 – 破坏了代码的总是只读属性,从而破坏了可修改性。 [1] http://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html

为什么.bss部分映射到比目标文件中报告的bss小的进程?

我总是假定链接器分配了任何库的bss部分并将其映射到进程中。 这部分的大小将取决于图书馆报告的bss的大小。 我查看了进程的/ proc / [PID] / maps文件,并计算了加载库的bss部分的大小。 7f1f5561f000-7f1f55637000 r-xp 00000000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55637000-7f1f55837000 —p 00018000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55837000-7f1f55838000 r–p 00018000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55838000-7f1f55839000 rw-p 00019000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55839000-7f1f5583d000 rw-p 00000000 00:00 0 7f1f5583d000-7f1f55851000 r-xp 00000000 08:01 3017945 /usr/lib/libresolv-2.19.so 7f1f55851000-7f1f55a50000 —p 00014000 08:01 3017945 /usr/lib/libresolv-2.19.so 7f1f55a50000-7f1f55a51000 r–p 00013000 08:01 3017945 /usr/lib/libresolv-2.19.so […]