标签: dynamic-linking

如何设置.so库将搜索其他.so库的路径?

我有一个libA.so,它依赖于libB.so,它位于../libB/(来自libA.c).我试图以这样的方式编译事物,我不必设置任何环境变量.我有:

    cc -std=c99 -c -fPIC -I../libB/ -Wall libA.c
    cc -std=c99 -shared libA.o -L../libB -lB -o libA.so
Run Code Online (Sandbox Code Playgroud)

编译好了.当我运行一个用dlopen加载libA的程序时,我得到:

dyld: Library not loaded: libB.so
  Referenced from: libA/libA.so
  Reason: image not found
Trace/BPT trap: 5
Run Code Online (Sandbox Code Playgroud)

所以libA在运行时没有找到libB.我找到了这个解决方案来改变Mac OS X上的运行时路径:

install_name_tool -change libB.so @loader_path /../ libB.so libA.so

但我想找到一个适用于OS X和Linux的解决方案.再一次,我试图让最终用户尽可能少做,所以我不希望他们必须设置环境变量,我必须使用cc(对我来说是Apple LLVM版本4.2(clang-425.0) .27)(基于LLVM 3.2svn),我也希望它也适用于Linux,所以大概是cc = gcc).

编辑 我的问题可能比我意识到的更复杂.我在C中创建这个动态库,但是尝试在python中使用它.我可以在python中使用libB.so(没有依赖关系)没有问题,当我从python中加载libA.so时它找到它(参见上面的错误),就在那时,libA.so意识到它没有'知道在哪里可以找到libB.so. 如果我在下面正确理解你的答案,解决方案依赖于在编译可执行文件时设置链接器路径,在我的例子中是python.

有没有办法告诉libA.so在编译时在哪里查找libB.so?我之后可以在OSX上使用install_name_tool来完成它,但是在编译器上没有办法可以在OSX和Linux上运行吗?

linux macos shared-libraries dynamic-linking cc

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

为什么 Visual Studio 需要静态库(.lib)来进行动态链接?

我想在我的项目(VS2013 - c++)中使用一些dll,

我使用“项目->属性->vc++目录”给出了dll和头文件的路径,构建项目后,出现链接器错误(常见的“无法解析的外部符号”)。这个问题可以通过将.lib文件交给链接器来解决!

但是为什么动态链接需要静态库(.lib)???

c++ linker dynamic-linking static-linking visual-studio-2013

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

仅 dlmopen 而不是 dlopen 的未解析符号

我正在使用一个共享库,它有相当多的全局变量,几乎在所有导出函数中使用,因此库函数不是线程安全的。我的应用程序创建多个线程,每个线程动态打开该库,并且为了避免在对导出函数的并行调用之间使用任何同步,我在磁盘上以不同的名称多次复制该库,每个线程打开自己的副本。为了避免这种情况,现在我想改用 dlmopen,但我遇到了一个问题。

当我在应用程序中使用 dlopen 打开库时,该应用程序运行良好

libHandle = dlopen(ip->pathname, (RTLD_LAZY |RTLD_LOCAL|RTLD_DEEPBIND|RTLD_NODELETE));
Run Code Online (Sandbox Code Playgroud)

当我在应用程序中使用 dlmopen 时,出现错误:

ip->libHandle = dlmopen(LM_ID_NEWLM, ip->pathname,
                (RTLD_LAZY |RTLD_LOCAL|RTLD_DEEPBIND|RTLD_NODELETE));
Run Code Online (Sandbox Code Playgroud)

dl错误是:

error(libfoo.so.0: undefined symbol: _ZTIN6google8protobuf11MessageLiteE)
Run Code Online (Sandbox Code Playgroud)

执行 nm 确实显示符号未定义 U _ZTIN6google8protobuf11MessageLiteE

问题 1:我想知道如何解决这个问题,以便我可以使用 dlmopen。

原因是因为当使用 LM_ID_NEWLM 时,会在 libc 中创建一个没有任何符号的新空命名空间。因此,该库应该是自包含的或与任何依赖项重新链接。

问题 2:我的主应用程序导出 libfoo 将使用的一些符号。由于在新的命名空间中打开 libfoo,主应用程序的符号对 libfoo 不可见,因此无法解析它们。有什么方法可以告诉链接器通过复制现有的基本命名空间来创建新的命名空间 NEWLM ,然后使用新创建的命名空间的 dlmopen + lmid 来打开 libfoo ,并且所有其他必需的符号都已存在?

问题 3:我可以自己映射 libfoo 的不同部分,并提供指向 libc 的映射部分的指针吗?意味着承担打开文件并将其从 libc 映射出来的工作,并让它完成符号解析的工作?这样我根本不需要调用 dlopen 并且多个文本部分的问题将得到解决。

dll linker multithreading dynamic-linking dlopen

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

在C#单元测试中使用64位本机.DLL

我有一个由CMake自动生成的vcxproj文件构建的64位本机库。CMake构建脚本的一部分会在csharp中自动生成Swig文件。我使用下面标记为Articaft 1的.csproj 构建Swig生成的.cs文件。然后,我有一个C#单元测试项目Artifact 2,下面引用了从Articaft 1生成的.dll 。Articafct 2还会复制由64位本机库生成的dll。

如果我将本机库编译为32位库,那么一切正常,但是如果我在C#单元测试项目中使用64位本机库,则测试将失败并显示以下内容:

C:\Users\mehoggan\Devel\QuadKeys\UnitTestCSharp\TestBingSystem.cs:line 13
Result Message: 
Test method QuadKeyTests.TestBingSystem.TestCtor threw exception: 
System.TypeInitializationException: The type initializer for 'QuadKeyNS.SwigQuadKeyPINVOKE' threw an exception. ---> System.TypeInitializationException: The type initializer for 'SWIGExceptionHelper' threw an exception. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
Run Code Online (Sandbox Code Playgroud)

如何获得C#单元测试以使用库的64位版本?


神器1

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
    <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' …
Run Code Online (Sandbox Code Playgroud)

c# c++ 64-bit dynamic-linking

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

减少第三方库的导出符号

我的代码工作正常,但如果我将我的项目链接到第三方库libabc.so(源不可用),那么我突然会遇到分段错误。

我有一个看起来像这样的主程序

#include <opencv2/imgcodecs.hpp>
#include "Abc.h"

int main(int argc, char **argv)
{
    Abc dummyAbc;
    auto img = cv::imread("dummy.png");
    cv::imwrite("123.png", img);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

CMakeList.txt如下

cmake_minimum_required(VERSION 3.1)
set(CMAKE_C_STANDARD 11)
find_package(OpenCV COMPONENTS core highgui imgcodecs)
include_directories(${OpenCV_INCLUDE_DIR})

add_executable(my_project Main.cpp)
target_link_libraries(my_project ${OpenCV_LIBRARIES} abc)
Run Code Online (Sandbox Code Playgroud)

编译良好,但运行时出现段错误。如果我删除该行

cmake_minimum_required(VERSION 3.1)
set(CMAKE_C_STANDARD 11)
find_package(OpenCV COMPONENTS core highgui imgcodecs)
include_directories(${OpenCV_INCLUDE_DIR})

add_executable(my_project Main.cpp)
target_link_libraries(my_project ${OpenCV_LIBRARIES} abc)
Run Code Online (Sandbox Code Playgroud)

然后一切正常(即没有丢失文件或opencv的问题)。

如果我检查段错误的堆栈,我会看到:

Thread 1 "my_project" received signal SIGSEGV, Segmentation fault.
0x00007fdea96836b3 in png_destroy_write_struct () from /usr/local/lib/libabc.so
Run Code Online (Sandbox Code Playgroud)

正在png_destroy_write_struct被 呼叫cv::imwrite

和 …

c++ opencv shared-libraries dynamic-linking dynamic-loading

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

导入 Protobuf 时出现 RuntimeLibrary 不匹配错误(Win64、CMake)

我有一个项目,其架构如下:

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 projects\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 io\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 data.proto\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 generated\n\xe2\x94\x82   \xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 data.pb.cc\n\xe2\x94\x82   \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 data.pb.h\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 service\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.cpp\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dll_project_1\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 dll_project_2\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 third_party\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 protobuf\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cmake\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 include\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib\n
Run Code Online (Sandbox Code Playgroud)\n

项目目录包含我的所有项目(显然):

\n
    \n
  • service是可执行项目
  • \n
  • io一个静态库,我只想编辑其中的“.proto”文件
  • \n
  • 其他项目基本上都是一些共享库
  • \n
\n

Third_party /protobuf包含此处列出的所有 protobuf 安装文件。请注意,为了安装 protobuf,我遵循了此处的所有说明(在 Debug x64 和 Release x64 中均使用 Visual Studio …

c++ cmake dynamic-linking protocol-buffers static-linking

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

iOS什么时候使用动态链接库?在iOS中使用动态库有什么好处?

我对Window 或 Linux 中的动态链接库和 iOS 中的动态链接库的优势之间的差异感到很奇怪。

\n

下面的\xe2\xac\x87\xef\xb8\x8f这几句就是为了证明我为什么感觉怪怪的。

\n

我了解到库可以分为静态库动态库

\n

使用动态库的优点是允许其他应用程序使用相同的动态库(在Window中,.dll文件),这样每个应用程序的内存使用量都可以减少,并且可以更容易地重新分发动态库而不是重新分发应用程序。\n实际上我在使用某些应用程序时可能会遇到“没有XXX.dll文件”的情况

\n

在Xcode中,当创建新项目时,我们可以在.\n中选择框架静态库framework & library。\n创建项目后,我们可以选择如何成为Mach-O Type,例如“可执行文件,动态库,静态库”等。

\n

所以,我认为如果我选择带有动态库的Mach-O类型,则该项目将使用动态链接库以链接方式编译。

\n

\xe2\xac\x87\xef\xb8\x8f 我真的很想知道。

\n
    \n
  1. 但就像在 Window 中一样,iOS 用户可以在 iPhone 中下载.so 文件以便应用程序正常工作或更新动态库吗?
  2. \n
  3. iPhone 中启动的其他应用程序可以使用相同的动态库吗?
  4. \n
\n

因为我无法体验到这一点。

\n
    \n
  1. 如果它(1,2)不能,为什么要使用动态库,即使我们无法像在 Window 或 Linux 中那样获得使用动态库的实际优势?
  2. \n
\n

xcode dynamic-linking dynamic-library ios

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

了解 GOT(全局偏移表)和 PLT?

在写这个问题之前,我想强调一下,我自己做了几周的研究,阅读了数十篇文章,但这个问题仍然没有解决,而且我得到的解释根本没有意义(也许是因为我是链接世界的新手) )。所以我希望有人能提供简单但非常详细的答案。

我知道 GOT(全局偏移表)可以帮助我们解析动态链接中从另一个引用的全局符号。另外我读到:“每个共享库都有自己的 GOT”

  1. 但这是有问题的,如果两个程序使用同一个共享库怎么办?两者对于全局变量都有相同的值,但事实不应该如此。

  2. 至于我的主要问题:如果我不想使用惰性绑定,那么为什么我们需要 PLT,为什么不直接使用普通的 GOT 来处理变量呢?

assembly linker dynamic-linking static-libraries got

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

C++ 标准对动态库有何规定?

C++ 标准对动态库有何规定?我听说它完全忽略了它们(出于某种原因) - 如果这是真的,为什么会这样?

c++ dynamic-linking dynamic-library

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

使用node-gyp将Node.js模块中的Boost链接起来

我正在尝试创建一个node.js附加组件,它是一个简单的包装器,用于从Boost库项目访问perl正则表达式.

我正在运行OSX 10.9.2,而且我也不是一个c ++开发人员,所以工具不熟悉.

我的项目如下

boost.cc

#include <node.h>
#include <v8.h>

#include <boost/regex.hpp>

using namespace v8;

Handle<Value> Match(const Arguments& args) {
  HandleScope scope;

  if (args.Length() < 2) {
    ThrowException(Exception::TypeError(String::New("Wrong number of arguments")));
    return scope.Close(Undefined());
  }

  if (!args[0]->IsString())
  {
    ThrowException(Exception::TypeError(String::New("Regex agrument 1 must be a string")));
    return scope.Close(Undefined());
  }

  if (!args[1]->IsString())
  {
    ThrowException(Exception::TypeError(String::New("Target agrument 2 must be a string")));
    return scope.Close(Undefined());
  }

  v8::String::Utf8Value param0(args[0]->ToString());
  v8::String::Utf8Value param1(args[1]->ToString());

  std::string sre = std::string(*param0);
  std::string s = std::string(*param1); 

  try
  {
    boost::cmatch matches;
    boost::regex re(sre, boost::regex::icase);

    if …
Run Code Online (Sandbox Code Playgroud)

c++ dynamic-linking node.js node-gyp

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