标签: dynamic-library

设置LD_LIBRARY_PATH环境变量以在运行时加载共享库(g ++)

我遇到了与同一问题有关的两个问题:

  1. 我有一个共享对象保存在`pwd`/lib中,而使用它的可执行文件成功编译(通过使用-l和-L开关),在运行时,它给了我悲伤.如果我尝试运行LD_LIBRARY_PATH=/my/absolute/path/to/library/directory ./test它工作正常.但是如果我将LD_LIBRARY_PATH =/my/absolute/path /导出到/ library /目录并执行./test它说它找不到共享库.但是,如果我再做LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./test一次它工作正常!! 关于我做错了什么的任何想法?

  2. 第二个问题与LD_LIBRARY_PATH env变量的导出有关.如果我打开终端并键入export LD_LIBRARY_PATH=/path/to/stuff然后键入echo $LD_LIBRARY_PATH,则变量是正确的.但是,如果我编写一个包含export命令的脚本,只需运行它就不会更新变量,而是需要运行source install.sh才能实际保存变量.什么是最好的解决方案?

感谢您的时间!

g++ environment-variables dynamic-linking dynamic-library

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

使用gcc --shared -m64 -Wl, - whole-archive ./*.a从静态库创建动态库

我收到这组gcc错误,我似乎无法从谷歌或手册页得到答案.任何洞察这些意味着什么或从哪里开始寻找?

这是makefile中的行:

#After building several otehr bits of code into static libraries
...
# Grand finally link all the object files into one
        gcc --shared  \
        -m64 \
        -Wl,--whole-archive ./release64/*.a \
        -o ./release64/libMYLIB.so.1.0
        ln -sf libArcGIS.so.1.0 ./release64/libMYLIB.so
        ln -sf libArcGIS.so.1.0 ./release64/libMYLIB.so.1
Run Code Online (Sandbox Code Playgroud)

我得到了以下错误(还有更多我采取了前n只是为了给出一个想法:

/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_muldi3.o): In function `__multi3':
(.text+0x0): multiple definition of `__multi3'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_muldi3.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_negdi2.o): In function `__negti2':
(.text+0x0): multiple definition of `__negti2'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_negdi2.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_lshrdi3.o): In function `__lshrti3':
(.text+0x0): multiple definition of `__lshrti3'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_lshrdi3.o):(.text+0x0): first defined …
Run Code Online (Sandbox Code Playgroud)

gcc static-libraries dynamic-library

4
推荐指数
2
解决办法
2125
查看次数

"C++ dlopen mini HOWTO"是用于编译动态加载的C++插件库的推荐技术吗?

通过插件.
我们指的是一个加载了vi的库,dlopen()它的符号通过dlsym()(不是由运行时系统动态加载的标准分片库)来解析.

参考http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/.该文档最后一次更新于2006年.它建议使用extern "C"以防止功能名称的损坏,以便dlsym相对容易地找到它的功能.

这仍然与动态库有关吗?在我的特定情况下,我正在尝试使用libtool在OSX上创建动态库.也许使用__attribute__ ((constructor))更时尚和现代,我几乎没有成功发现推荐的做法.

c++ dynamic-library

4
推荐指数
1
解决办法
1947
查看次数

如何获得指向动态库(Linux ELF)特定部分的指针?

该问题第二个答案中可以看出,使用节的名称从内部获取指向程序特定节的指针非常简单。使用libelf,只需打开程序自己的文件,循环访问其中的所有节(由Elf64_Shdrstruct 表示),当节名称与所需的节名称匹配时停止,并使用存储在struct sh_addr元素中的指针Elf64_Shdr。在这种情况下,获取所需的指针非常简单,因为它是在ELF可执行文件中定义的。

但是,假设您有一个使用动态库的程序,并且需要获取指向该动态库的一部分的指针。由于其节的地址是在运行时定义的,如何获得指向动态库节的指针?

顺便说一句,动态库和主程序本身每个都有一个具有相同名称的部分(这是我需要获得的指针所在的部分)。因此,在这种情况下,这两个同名的段是否可能相邻存储在内存中,所以我只需要获取指向主文件段的指针(如我在第一段中所述)并添加偏移量即可到达动态库部分?

c linux memory elf dynamic-library

4
推荐指数
1
解决办法
1360
查看次数

如何确定哪个动态库负责创建指针?

假设您有一个使用dlopen()加载多个共享对象/动态库的程序.给定一个指向全局对象的指针(例如静态成员变量),是否可以确定指针是在哪个库的边界中分配的?

c c++ linux shared-objects dynamic-library

4
推荐指数
1
解决办法
156
查看次数

Linux C/C++ 在动态库中分配/释放内存

我必须将我的应用程序拆分为几个逻辑模块。

mainapp

  • module1.so
  • module2.so
  • module3.so
  • 等等

每个模块都是一个*.so库,将在运行时加载。

每个模块共享相同的接口并返回一些数据数组。例如:

int *ptr = module1->getIntData();

可以在mainapp一边释放/删除此内存吗?

int *ptr = module1->getIntData();
delete ptr; //(or free(ptr))
Run Code Online (Sandbox Code Playgroud)

malloc/free 实现怎么样。有没有可能,那个库会使用另一个然后是 mainapp?

c c++ linux allocation dynamic-library

4
推荐指数
1
解决办法
995
查看次数

如何为包含依赖关系作为cocoapods的动态库构建聚合目标

我正在尝试创建一个ios动态库.这个库包含许多使用cocoapods安装的依赖项.我使用通常的ios动态库模板构建它,我可以在其他只适用于单个架构的项目中使用它.现在我需要它适用于所有体系结构,因此需要创建一个聚合目标.但是我得到的聚合目标的脚本不包括cocoapods依赖项,当我编译聚合时,我得到错误,例如依赖项中找不到的文件.以下是脚本我在用.

# Merge Script

# 1
# Set bash script to exit immediately if any commands fail.
set -e

# 2
# Setup some constants for use later on.
FRAMEWORK_NAME="MyProject"

# 3
# If remnants from a previous build exist, delete them.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi

# 4
# Build the framework for device and for simulator (using
# all needed architectures).


xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch arm64 -arch armv7 -arch armv7s only_active_arch=no …
Run Code Online (Sandbox Code Playgroud)

dynamic-library ios

4
推荐指数
1
解决办法
1984
查看次数

机器人框架库动态导入不是全局的

一些背景

我正在使用Robot Framework with Python为测试自动化创建一个小框架.我有几个不同的库; 一对是特定于应用程序的,一个是关键字,我希望始终可用.这个永远可用的库是我的公共库,我需要它可以从我的其他库中的函数访问.

到目前为止,我完成此操作的方式是我的其他库顶部的一些样板.具体来说,在我的其他图书馆中,我有:

try:
    self.common_library = BuiltIn().get_library_instance("my_common_lib")
except RuntimeError:
    BuiltIn().import_library("my_common_lib", True)
    self.common_library = BuiltIn().get_library_instance("my_common_lib")
Run Code Online (Sandbox Code Playgroud)

此代码检查当前Robot上下文中是否存在公共库并获取对它的引用,必要时首先导入库.这意味着我在所有其他库中都引用了公共库,这意味着每当我在Robot设置表中导入任何库时,我也可以访问公共库关键字.

问题是当按顺序运行多个Robot测试时,公共库似乎消失了.我在目录中有一些Robot脚本并运行"robot*.robot".在每个测试中,我从公共库运行一个关键字.我从不在设置表中导入公共库,因为它应该由其他库自动导入,如上所述.在第一个测试中,公共库存在并且其中的关键字正常工作.在以下所有测试中,我收到一个未找到关键字的错误.当我打印结果时,BuiltIn().get_library_instance(all=True)我可以看到,虽然我的应用程序特定库仍然加载,但公共库不再存在.

问题

我的所有图书馆都有ROBOT_LIBRARY_SCOPE = 'GLOBAL',包括公共图书馆.我的公共库是通过BuiltIn动态导入的,并且定义了全局作用域,但是在一个命令中运行后续测试时似乎超出了作用域.是否有动态导入库的范围超出范围,即使它们具有全局库范围?

从本质上讲,我希望这个公共库始终可以在我的机器人脚本中使用,并让每个自定义库都保持对公共库的引用.如果有更好的方法来完成这个或某种方式来制作我目前正在做的工作,请告诉我!谢谢.

python global-scope dynamic-library robotframework

4
推荐指数
1
解决办法
501
查看次数

DYLD_PRINT_LIBRARIES 不工作

尝试使用其他 DYLD_ 属性进行试验时,我发现 jvm 正在使用属性进行操作,并且在执行过程中会忽略这些属性。
我的 Java 测试:

class Env {
    public static void main(String... args) {
        System.getenv().entrySet().stream().forEach(e -> System.out.println(e.getKey() + " = " + e.getValue()));
    }
}
Run Code Online (Sandbox Code Playgroud)

调用:

$ export DYLD_PRINT_LIBRARIES=1
$ export MY_PRINT_LIBRARIES=2
$ javac Env.java && java Env|grep PRINT
MY_PRINT_LIBRARIES = 2
$ 
Run Code Online (Sandbox Code Playgroud)

另一方面,我的 C 测试:

#include <stdio.h>

int main(int argc, char **argv, char **envp) {
    while (*envp) {
        printf("%s\n", *envp);
        envp++;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

调用:

$ gcc env.c && ./a.out|grep PRINT
dyld: loaded: /Users/okutane/test/java/./a.out
dyld: …
Run Code Online (Sandbox Code Playgroud)

java macos darwin dyld dynamic-library

3
推荐指数
1
解决办法
3624
查看次数

libgpiod API 使用(Linux 共享库)

有人对 libgpiod API 有经验吗?我已经在我的linux平台上安装了它,但无法调用它的库函数。

我安装的是:

git clone git://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git
cd libgpiod
./autogen.sh
make
make install
Run Code Online (Sandbox Code Playgroud)

之后,我在/usr/local/lib/中看到libgpiod.so库,在/usr/local/include/中看到gpiod.h(出于良好的考虑,我也运行了)。但是,当我尝试编译以下内容时:ldconfig

测试.c

#include <gpiod.h>

struct gpio_chip *chip;    

int main(void)
{
    chip = gpio_chip_open("/dev/gpiochip4");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:undefined reference to 'gpiod_chip_open'

谁能帮我看看我哪里出了问题?

提前谢谢了!

c api embedded-linux dynamic-library gpio

3
推荐指数
1
解决办法
8778
查看次数