Tag: 动态链接

从C ++ / CLI Visual Studio 2010调用使用VS 2005编译的本机C – 无法打开.lib文件…

嗨,我想调用从C dll到C ++ / CLI的函数。 C函数声明为extern。 我按照本教程链接dll: http : //social.msdn.microsoft.com/Forums/en/Vsexpressvc/thread/84deabaa-ae82-47cc-aac0-592f5a8dfa22然后在我的C ++ / CLI dll中我有以下内容: // testWrapper.h #pragma once using namespace System; namespace testWrapper { extern “C” int GtoCalcImpliedVolatility2( double premium, int optionType, double underPrice, double strike, double yearsToExpiry, double yearsToPayment, double volGuess, double discountRate, double dividendRate, double growthRate, double *impliedVol); public ref class MyNamesSplitterClass { […]

无法链接BFD

我想在我的项目中包含这个文件: 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以查看我应该使用的是否有不同的标志,但是pkg-config没有引用BFD或binutils 。 无论我尝试过什么,我都会遇到以下错误: 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’ 首先,我正在编译我的记录器和我上面链接的backtrace-symbols.c文件(因为记录器是我打算用它来打印痕迹的地方)。 然后我将这两个目标文件一起链接到一个组合的目标文件中: CC = clang CFLAGS = -g -Wall -c SOURCE = simplog.c OBJ = simplog.o, simplog-temp.o, backtrace-symbols.o all: […]

链接到共享符号名称的库的程序运行错误

这有点难以理解,但我正在尽我所能。 在Red Hat 6.4上使用gcc 4.4.6和ld 2.20.51, 我从一个共享库(.so)和一个静态库(.a)链接到二进制可执行PROGRAM代码。 共享库公开由PROGRAM直接调用的API。 该共享库的实现是针对静态库静态库lib1编译和链接的。 静态库还公开了自己的API,它由PROGRAM直接调用。 它的一些实现是基于直接复制到其中的静态lib1文件的一个子集。 任何API(任一库)都没有实际公开数据类型或静态lib1实现的函数。 因为代码被复制,所以符号是相同的。 在运行时我看到这种行为: 如果链接库的顺序是共享库 , 静态库 ,那么调用共享库API并调用静态库* API都将使用** static lib1中的实现 。 如果链接器的库顺序是静态库 , 共享库 ,那么调用共享库API并调用静态库API都将使用静态库1中的实现– 来自lib1的代码修改 。 如何调用静态库API以在lib 1中修改代码中运行实现,而在共享库API中运行实现在静态lib1中 ?

dlopen与标准动态链接的用例有哪些?

根据文档, dlopen与dlsym一起使用来加载库,并获得指向符号的指针。 但这已经是动态加载器/链接器的作用了。 而且,这两种方法都基于ld.so. 使用dlopen时似乎有两个不同之处: 该库可以有条件地加载。 编译器不知道我们正在使用的符号(类型,原型……),因此不会检查潜在的错误。 顺便说一句,这是实现内省的一种方式。 但是,除了边缘的例子之外,它似乎没有激励使用dlopen不是标准加载: 在内存占用优化方面,当共享库已经被另一个程序使用时,条件加载并不是很有趣:加载已经使用过的库并不会增加内存占用。 避免编译器监控是不安全的,也是编写错误的好方法……我们也错过了潜在的编译器优化。 那么,还有其他用途,其中dlopen优先于标准的动态链接/加载吗?

为什么我们在编译期间需要共享库

为什么在可执行文件的编译期间我们需要共享库的存在? 我的理由是,由于共享库未包含在我的可执行文件中并且在运行时加载,因此在编译期间不应该需要它。 或者我错过了什么? #include int addNumbers(int, int); //prototype should be enough, no? int main(int argc, char* argv[]){ int sum = addNumbers(1,2); printf(“sum is %d\n”, sum); return 0; } 我在我当前的目录中有libfoo.so ,但我将其名称更改为libfar.so ,以便在编译时发现需要共享库,或者它不能编译。 gcc -o main main.c -L. -lfoo gcc -o main main.c -L. -lfoo给main.c:(.text+0x28): undefiend reference to ‘addNumber’ 我认为只有共享库的名称才足够。 不需要共享库本身,因为它位于LD_LIBRARY_PATH中并在运行时动态加载。 除了共享库的名称之外还需要其他东西吗?

OpenCL C / C ++动态绑定库(win32及更多)

我正在尝试使用OpenCL,为了将其投入生产,我希望能够动态绑定到OpenCL.DLL(在Windows下),以便在没有OpenCL的情况下“优雅地”处理安装在主机上。 是否有任何可用的库(或代码片段)在C或C ++中处理这种动态绑定,就像GLEW对OpenGL一样? 我想避免自己做这件事的麻烦。 谢谢,

静态和动态地链接同一个库

我有一个静态链接到库( libA.2.0.a )的程序,并且还动态链接到另一个库( libB.so )。 libB.so还动态链接到旧版本的libA( libA.1.0.so )。 这种配置是否可行? 如果是这样,系统如何知道使用libA.2.0.a的符号表示我的程序, libA.1.0.so的符号表示libB.so ?

-symbolic和-shared GCC标志之间有什么区别?

从文档的描述中,他们似乎做了同样的事情,除了“并非所有系统”支持共享和“只有一些系统”支持符号(不清楚这些是否是同一组系统): -shared生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件。 并非所有系统都支持此选项。 对于可预测的结果,还必须指定在指定此选项时用于生成代码(-fpic,-fPIC或模型子选项)的同一组选项。[1] -symbolic在构建共享对象时绑定对全局符号的引用。 警告任何未解析的引用(除非被链接编辑器选项-Xlinker -z -Xlinker defs覆盖)。 只有少数系统支持此选项。 我怀疑区别在于“生成一个共享对象,然后可以与其他对象链接以形成可执行文件”部分,但这听起来像任何库都是如此。 这是否意味着生成的共享对象也可以静态链接?

C运行时静态与动态链接中的内存分配

我的程序架构涉及插件(dll)和exe(显然)。 我们是唯一的插件提供商。 有人告诉我,如果我们静态链接c运行时,在插件中分配内存然后在exe代码中释放它是一个潜在的问题。 但是,如果我们动态链接它,那么只有一个堆,并且c运行时可以访问所有这些堆。 我们根据这个建议切换到动态链接,但是我们从交换机看到的所有内容都是令人头疼的问题,以及与新运行时的分发和安装相关的麻烦。 (不知道我们在内存分配问题上避免了什么。) 内存分配的含义是什么? 假设一个插件分配内存,exe释放它。 静态与动态链接的c运行时之间是否存在不同的行为? 如果我们使用插件,我们是否会在静态链接c运行时时遇到问题? 如果我们切换回静态链接,那会破坏内存泄漏检测和崩溃转储报告吗? 与我选择哪个VC ++运行时版本的注释提出的一些问题一致- 静态还是动态? 具体来说,我选择哪个VC ++运行时版本 – 静态还是动态? 在http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.100).aspx上也有一些讨论。

编译自定义malloc

我编写了一个使用标准C原型实现malloc / calloc / realloc / free的自定义库,我想出了如何编译它。 我想通过链接标准应用程序来测试库吗? 这样做有什么好办法? 一旦我有一个工作库,我假设我可以用LD_PRELOAD加载它,但是如何使我的函数与其共存但优先于系统库? 我的函数需要调用malloc才能让内存运行,所以我不能完全抛弃stdlib …帮助?