我有以下C++代码来制作DLL(Visual Studio 2010).
class Shape {
public:
Shape() {
nshapes++;
}
virtual ~Shape() {
nshapes--;
};
double x, y;
void move(double dx, double dy);
virtual double area(void) = 0;
virtual double perimeter(void) = 0;
static int nshapes;
};
class __declspec(dllexport) Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) { };
virtual double area(void);
virtual double perimeter(void);
};
class __declspec(dllexport) Square : public Shape {
private:
double width;
public:
Square(double w) : width(w) { };
virtual …Run Code Online (Sandbox Code Playgroud) 如何以与 SONAME 冲突的库的两个现有版本兼容的方式链接二进制文件?这两个版本不共享相同的 SONAME 前缀。一个是 libcapi10.so.3,另一个是 libcapi10.so.4。我无法重新编译它们,因为我将它们作为二进制文件,而且由于这些是经过认证的加密库,我无法使用正确的 SONAME 请求新的库。当然,如果一个是 libcap10.so.3 和另一个 libcap10.so.3.1,我不会遇到任何问题,因为我只需要链接第一个以与第二个兼容。这两个库被告知是二进制兼容的(我应该相信这个信息)。我搜索但没有找到任何好的方法,无论是使用链接器选项还是使用 objcopy。我想避免手动修补二进制文件以在编译链接时使用它。
所以回到我最初的问题:如何指定 SONAME(在本例中为 libcap10.so)用于链接?
(我已经搜索过了,我目前的发现只是它是行不通的,但不幸的是这是一个要求......)。
更新:我使用类似于 sed 的二进制工具修补了 .so 库,将 libcapi10.so.6\0 替换为 libcapi10.so\0,这是因为新名称比以前短并且 SONAME 的 elf 结构是以 C 字符串结尾的带有 0 并且在 gcc 链接期间不使用精灵校验和。我仅在编译时使用该修补库,然后我可以在目标系统上使用一个或另一个具有相同二进制文件的原始库。
我用boost shared_ptr头文件编写了一个程序.如何编译这个程序?我-l在编译时提到了g ++选项的库.
我正在尝试在我的 ubuntu 13:04 上安装一个开源项目,但 make 过程在名为updateDB.c的类中的方法上失败。在编译期间,我有这个错误:
updateDB.o: In function `update_cache_hash':
/usr/local/src/bgpinspect-0.5/src/updateDB.c:142: undefined reference to `EVP_DigestUpdate'
/usr/local/src/bgpinspect-0.5/src/updateDB.c:143: undefined reference to `EVP_DigestFinal_ex'
collect2: error: ld returned 1 exit status
make[1]: *** [BGPdb] Error 1
make[1]: Leaving directory `/usr/local/src/bgpinspect-0.5/src'
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
这是失败的update_cache_hash方法:
static uint16_t update_cache_hash( char *buff, int size ) {
unsigned char md_hash[EVP_MAX_MD_SIZE];
unsigned int md_len;
uint16_t hash;
EVP_DigestUpdate(&global_table.ctx, buff, size );
EVP_DigestFinal_ex(&global_table.ctx, md_hash, &md_len);
if ( md_len < 2 ) {
ps_log( PS_LOG_ERROR, "EVP_DigestFinal_ex …Run Code Online (Sandbox Code Playgroud) 我想在我的项目中包含这个文件:http://cairo.sourcearchive.com/documentation/1.9.4/backtrace-symbols_8c-source.html
但它需要与BFD链接.我有两个binutils并binutils-devel安装.我已经尝试过连接-lbfd以及直接连接/usr/lib64/libbfd.so和/usr/lib64/libbfd.a(两者都存在).我也试图寻找pkg-config,看看是否有我应该使用不同的标志,但目前还BFD或没有提及binutils在pkg-config.
无论我尝试过什么,我都会遇到以下错误:
undefined reference to 'bfd_init'
undefined reference to 'bfd_openr'
undefined reference to 'bfd_check_format'
undefined reference to 'bfd_checkformat_matches'
undefined reference to 'bfd_close'
undefined reference to 'bfd_map_over_sections'
Run Code Online (Sandbox Code Playgroud)
首先,我正在编译我的记录器和backtrace-symbols.c上面链接的文件(因为记录器是我打算用它来打印痕迹的地方).然后我将这两个目标文件一起链接到一个组合的目标文件中:
CC = clang
CFLAGS = -g -Wall -c
SOURCE = simplog.c
OBJ = simplog.o, simplog-temp.o, backtrace-symbols.o
all:
$(CC) $(CFLAGS) $(SOURCE); mv simplog.o simplog-temp.o; \
$(CC) -ansi $(CFLAGS) backtrace-symbols.c; \
ld -r …Run Code Online (Sandbox Code Playgroud) 我想在Linux上运行基于Qt 5的应用程序usind动态库.总之,脚本会将可执行文件和其他相关文件(包括lib文件夹中所有必需的.so)复制到所需目标,并且脚本调用gksudo将作为应用程序的调用者.
直到我调用可执行脚本直到现在一切正常:应用程序无法运行.当我要求运行时sudo,它告诉我库(Qt5SerialPort ...)丢失了.运行ldd实际的可执行文件我发现应用程序正在从lib文件夹中获取所需的库,但是一些明显的硬编码路径.
我尝试通过使用解决这个问题,qt.conf但没有成功.在这里注意,似乎qt.conf实际上并不应该以这种方式工作.咨询Qt文档,我决定用LD_LIBRARY_PATH链接器告诉链接器在哪里找到libs,因为我已经使用脚本来运行应用程序了.所以最终的,总结的脚本代码是
#!/bin/sh
LD_LIBRARY_PATH=lib/
export LD_LIBRARY_PATH
sudo ldconfig #sometimes sudo /sbin/ldconfig -v
gksudo "$INSPATH/myApp" #or sudo instead
Run Code Online (Sandbox Code Playgroud)
问题是它仍然无法正常工作.当我打电话时echo $LD_LIBRARY_PATH,我可以看到变量被正确编辑,但当我调用运行行(使用sudo)时,它一直告诉我没有找到lib.
我错过了什么?
要链接静态库,我必须从 .h 和 .c 文件创建 .lib。然后我将其添加到我的项目中,放入附加依赖项并进行编译。
要使用 dll,我需要 .dll 和 .lib。这个.lib和上面的一样还是不一样?如何让 Visual Studio 使用 .dll 和 .lin,而不仅仅是 .lib?我将 .dll 放入项目目录中,但没有任何更改(.exe 具有相同的大小(我认为应该更小))。
我有一个 Linux 共享对象,它与一些共享对象动态链接,其中一些又与其他共享对象进一步动态链接,需要间接动态链接。为了找到这些 SO,我通过将链接器标志传递给 G++ 将 RPATH 标头嵌入到我的顶级 SO 中,如下所示:
-Xlinker -rpath -Xlinker $ORIGIN/../my/libs
Run Code Online (Sandbox Code Playgroud)
这适用于 Ubuntu 16.04 和 CentOS 7.x(使用来自 DevToolset 7 的 G++ 7.3)。但是,在 Ubuntu 18.04 上执行此构建时,它会嵌入一个 RUNPATH 标头。与 RPATH 不同,RUNPATH 仅用于查找我的顶级 SO 所需的 SO,而不考虑它们所需的后续 SO 的间接动态链接。
我已经确认从 RPATH 到 RUNPATH 的更改导致了这个问题。当我使用在 Ubuntu 16.04 上构建的具有 RPATH 标头的 SO 时,间接链接可以正常工作。当我使用chrpath -c将 RPATH 标头更改为 RUNPATH 标头时,间接链接在 Ubuntu 18.04 和 Ubuntu 16.04 上都会中断。
如何让链接器在 Ubuntu 18.04 上使用 RPATH?或者,如何完成chrpath -c的逆操作- 将 …
如何找出我的程序在运行时使用的共享库的路径?
我将 glibc 2.12 作为在我的 CentOS 6.10 系统上运行的主要glibc ,并且还在/opt/glibc-2.14.
当我检查我的可执行文件时
$ objdump -p ./myProgram
Run Code Online (Sandbox Code Playgroud)
它提供了这个信息
Dynamic Section:
NEEDED libpthread.so.0
NEEDED libcurl.so.4
NEEDED libc.so.6
Run Code Online (Sandbox Code Playgroud)
我的LD_LIBRARY_PATH有这个值/opt/glibc-2.14/lib。
是否可以查看我的程序在运行时libc.so.6实际使用的库(可能是库文件的路径)?
我一直认为libc应该是一个独立的动态库,直到我发现这个:
$ ldd /lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2 (0x00007fd743c00000)
linux-vdso.so.1 (0x00007fffc75f4000)
Run Code Online (Sandbox Code Playgroud)
有人能告诉我为什么 libc 需要 ld.so 以及它使用什么功能吗?
dynamic-linking ×10
c ×5
linux ×4
c++ ×3
ld ×2
linker ×2
boost ×1
dll ×1
g++ ×1
gcc ×1
glibc ×1
makefile ×1
pkg-config ×1
qt ×1
qt5 ×1
rpath ×1
shared-ptr ×1
ubuntu-18.04 ×1
windows ×1