标签: shared-libraries

如何管理共享库中未定义的符号

我有一个共享库,其中有未定义的符号

JNI_CREATEJavaVM
Run Code Online (Sandbox Code Playgroud)

有什么方法可以包含外部依赖项或告诉编译器忽略该符号?

c gcc shared-libraries

0
推荐指数
1
解决办法
2471
查看次数

dlopen 是否创建多个库实例?

在网上搜索后,我似乎找不到答案。

当我第一次使用 dlopen 时,它似乎比此后的任何时间都花费更长的时间,包括如果我从程序的多个实例运行它。

dlopen 是否将 so 加载到内存中一次并让操作系统保存它,以便任何后续调用(甚至来自程序的另一个实例)都指向内存中的同一位置?

那么基本上运行一个库的程序的 3 个实例是否意味着同一个 .so 的 3 个实例被加载到内存中,或者内存中只有一个实例?

谢谢

c++ shared-libraries dlopen

0
推荐指数
1
解决办法
2693
查看次数

Python如何在多个项目之间共享包

我有一个包,其中包含来自多个供应商的特定硬件的协议。这基本上是具有相似接口的多个不同协议的集合。它是由我移植到 python 的。但是现在我有两个项目使用不同的传输协议处理与该设备的通信,一个是通过 TCP 另一个是通过 RS-485/232。如何在这两个项目之间使用协议共享包,以便在添加新功能支持或错误修复后不需要复制它。

python shared-libraries multiple-projects

0
推荐指数
1
解决办法
2227
查看次数

dlclose 后 dlopen(RTLD_NOLOAD) 仍然返回非空

我正在编写一个函数来检查 .so 是否在 Linux 下加载,代码如下:

#include <iostream>
#include <dlfcn.h>
#include <unistd.h>
using namespace std;

bool isLibraryLoaded(const string& libPath)
{
   return (nullptr != dlopen(libPath.c_str(), RTLD_NOW | RTLD_NOLOAD));
}

int main(int argc, char** argv)
{
   const string libPath = "/path/to/library.so";

   cout << "loaded: " << isLibraryLoaded(libPath) << endl;

   sleep(8); // first execution of lsof

   // load lib
   void* handle = dlopen(libPath.c_str(), RTLD_NOW);
   cout << "handle: " << handle << endl;
   if (nullptr != handle)
   {
      cout << "loaded: " << isLibraryLoaded(libPath) << …
Run Code Online (Sandbox Code Playgroud)

c++ shared-libraries dlopen

0
推荐指数
1
解决办法
2666
查看次数

如何将标签推入可重定位共享库的堆栈中,其对象应使用 -fPIC 进行编译?

我正在使用从汇编代码组装的多个目标文件来制作可重定位共享库(所有编译都应使用 -fPIC 和 -DPIC)。

在我的代码中我有push label说明。当我使用一切看起来都很好将汇编代码组装成目标文件时-fPIC -DPIC,但是当我想使用目标文件创建共享库时,我收到了消息relocation R_X86_64_32S against '.text' can not be used when making a shared object; recompile with -fPIC

我确信问题出在这些push label说明上,因为当我删除它们时,错误就会消失。

关于如何组装它有什么想法吗?

顺便说一句,我的平台是采用 Intel x86_64 架构的 Linux,编译器gcc采用 GAS 语法。我对 64 位库感兴趣。

assembly x86-64 shared-libraries

0
推荐指数
1
解决办法
453
查看次数

对 dlopen 的未定义引用

我有一个 C 程序,我想将其加载到正在运行的 C 程序中。以下是片段

文件:ac

    #include <stdio.h>

    void abc() { 
      printf("This is abc\n"); 
    }

Run Code Online (Sandbox Code Playgroud)

文件:mainFile.cpp

    #include<stdio.h>
    #include <dlfcn.h>

    int main(int argc, char **argv) {

      void *lib = dlopen("./a.so", RTLD_LAZY);
       if (!lib) {
         printf("dlopen failed: %s\n", dlerror());
         return 1;
      }
      void (*f)() = dlsym(lib, "abc");
      if (f) {
          f();
      } else {
          printf("dlsym for f1 failed: %s\n", dlerror());
      }

      dlclose(lib);
      return 0;
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令进行编译

    gcc -fpic -g -shared -ldl -o a.so a.c
    g++ -w mainFile.cpp -o mainFile
Run Code Online (Sandbox Code Playgroud)

输出:

/tmp/cc9fYZaf.o: In …
Run Code Online (Sandbox Code Playgroud)

c c++ shared-libraries

0
推荐指数
1
解决办法
2669
查看次数

如何确保在定义之前声明 C++ 函数(如 override 关键字)?

在我的共享库中,我在头文件中声明了一个函数,并在 .cpp 源文件中定义了它。将应用程序与库链接时,链接器抱怨函数未定义,我不知道是因为缺少命名空间、不同的参数还是其他原因。

如果我可以将函数定义标记为“实现先前的声明”,我将在编译期间捕获此声明/定义差异,而不是稍后将应用程序与库链接时。

是否有类似于类方法的“覆盖”关键字的东西会阻止我在没有现有匹配声明的情况下定义函数?

我可以使用,-Wl,--no-undefined但有些库是在预期--no-undefined不会被使用的情况下创建的。

c++ shared-libraries

0
推荐指数
1
解决办法
76
查看次数

如何在 ubuntu 11.04 中设置 LD_LIBRARY_PATH

我已经看到了许多 LD_LIBRARY_PATH 的链接,但无法获得 LD_LIBRARY_PATH 的确切方法。我在那里使用了 ldd (用于动态库)

linux-gate.so.1 =>  (0x00f84000)
libcrypto.so.0.9.8 => /lib/libcrypto.so.0.9.8 (0x0018c000)
libxml2.so.2 => /usr/local/lib/libxml2.so.2 (0x00318000)
libxmlsec1.so.1 => /usr/local/lib/libxmlsec1.so.1 (0x00caa000)
libprotobuf-c.so.0 => /usr/local/lib/libprotobuf-c.so.0 (0x00957000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00110000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x009cc000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00136000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x00b89000)
libxslt.so.1 => /usr/local/lib/libxslt.so.1 (0x0013a000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x00172000)
libltdl.so.7 => /usr/lib/libltdl.so.7 (0x0017b000)
/lib/ld-linux.so.2 (0x007d1000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00d6a000)
Run Code Online (Sandbox Code Playgroud)

请告诉我必须用路径定义的确切方式和位置。

c linux shared-libraries

-1
推荐指数
1
解决办法
1万
查看次数

GNU链接器如何确定需要哪些C/C++库文件?

我正在OpenWRT机器(ARM路由器)上构建PHP7.我想要包含MySQL,所以我也必须构建它.OpenWRT是99.5%的普通linux,但有一些奇怪的构建/共享库事物可能不经常运行,所以我遇到了一些困难.

MySQL构建正常(经过一些调整后),我有一个libmysqlclient.so工作.但是,configurePHP7 的过程在尝试链接MySQL测试程序时失败,因为libmysqlclient.so必须与C++标准库链接,而不是C标准库.(MySQL显然至少部分是C++,它使用std::...stuff....) Configure尝试编译测试程序gcc,其中不包括链接中的C++库,因此测试失败.

我通过制作一个简单的C/C++切换脚本来解决这个问题:如果命令行包含-lmysqlclient那么我就是exec g++ $*其他人exec gcc $*.然后我告诉configure我使用我的脚本作为C编译器.

我发现必须有更好的方法来处理这个问题.似乎libmysqlclient.so应该有一些方法告诉链接器它也需要它libstdc++.so,所以即使gcc用于链接,所有必要的库也会被拉入.

有没有办法标记依赖关系libmysqlclient.so?或者configure更聪明地运行测试程序?

c c++ shared-libraries conflicting-libraries

-1
推荐指数
1
解决办法
71
查看次数

Linux 与 Windows 中的系统库

我的背景是 Windows,我是 Linux 菜鸟。仍然试图围绕一些基本概念,特别是系统库:

  1. Windows 有包装系统调用的 ntdll.dll 和一个 CRT dll,它在 C 语法与 ntdll 操作系统公开服务之间进行接口。
    (为简单起见,我忽略了 user32、kernel32、kernalbase 等中间层。我也意识到 CRT 是几个 dll,这不是重点)。
  2. 似乎 Unix/Linux 几乎只有 libc,它包装系统调用直接从您的应用程序代码中调用。

这是正确的比喻吗?(ntdll + CRT) <===> libc ?

我意识到 C 和 Unix 是一起进化的,但仍然感到惊讶。是否可以将 C 接口硬连接到 Unix/Linux 的操作系统中?在 Windows 中,非 C 程序链接到底层操作系统提供的 dll。在 Linux 中是否有可能没有 OS/C 运行时边界?

linux windows shared-libraries

-1
推荐指数
1
解决办法
593
查看次数

C库导出哪些功能?

如果我在Windows,Linux或Mac中使用C或C++库,有没有办法知道它导出的函数和数据结构及其签名而没有此库的文档?

c c++ dll shared-libraries

-2
推荐指数
1
解决办法
706
查看次数