我有一个共享库,其中有未定义的符号
JNI_CREATEJavaVM
Run Code Online (Sandbox Code Playgroud)
有什么方法可以包含外部依赖项或告诉编译器忽略该符号?
在网上搜索后,我似乎找不到答案。
当我第一次使用 dlopen 时,它似乎比此后的任何时间都花费更长的时间,包括如果我从程序的多个实例运行它。
dlopen 是否将 so 加载到内存中一次并让操作系统保存它,以便任何后续调用(甚至来自程序的另一个实例)都指向内存中的同一位置?
那么基本上运行一个库的程序的 3 个实例是否意味着同一个 .so 的 3 个实例被加载到内存中,或者内存中只有一个实例?
谢谢
我有一个包,其中包含来自多个供应商的特定硬件的协议。这基本上是具有相似接口的多个不同协议的集合。它是由我移植到 python 的。但是现在我有两个项目使用不同的传输协议处理与该设备的通信,一个是通过 TCP 另一个是通过 RS-485/232。如何在这两个项目之间使用协议共享包,以便在添加新功能支持或错误修复后不需要复制它。
我正在编写一个函数来检查 .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) 我正在使用从汇编代码组装的多个目标文件来制作可重定位共享库(所有编译都应使用 -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 位库感兴趣。
我有一个 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) 在我的共享库中,我在头文件中声明了一个函数,并在 .cpp 源文件中定义了它。将应用程序与库链接时,链接器抱怨函数未定义,我不知道是因为缺少命名空间、不同的参数还是其他原因。
如果我可以将函数定义标记为“实现先前的声明”,我将在编译期间捕获此声明/定义差异,而不是稍后将应用程序与库链接时。
是否有类似于类方法的“覆盖”关键字的东西会阻止我在没有现有匹配声明的情况下定义函数?
我可以使用,-Wl,--no-undefined但有些库是在预期--no-undefined不会被使用的情况下创建的。
我已经看到了许多 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)
请告诉我必须用路径定义的确切方式和位置。
我正在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更聪明地运行测试程序?
我的背景是 Windows,我是 Linux 菜鸟。仍然试图围绕一些基本概念,特别是系统库:
这是正确的比喻吗?(ntdll + CRT) <===> libc ?
我意识到 C 和 Unix 是一起进化的,但仍然感到惊讶。是否可以将 C 接口硬连接到 Unix/Linux 的操作系统中?在 Windows 中,非 C 程序链接到底层操作系统提供的 dll。在 Linux 中是否有可能没有 OS/C 运行时边界?
如果我在Windows,Linux或Mac中使用C或C++库,有没有办法知道它导出的函数和数据结构及其签名而没有此库的文档?