Tag: 共享库

OpenMP库规范

我是新手打开mp,我尝试从官方网站上的示例程序 #include #include int main() { #pragma omp parallel printf(“Hello from thread %d, nthreads %d\n”, omp_get_thread_num(), omp_get_num_threads()); } 我已经在eclipse中将库设置为项目属性 – > GCC c ++链接器中的libgomp- 但程序说/usr/bin/ld: cannot find -llibgomp我能知道我哪里错了

从C ++拦截Fortran STOP

我为传统的Fortran库准备了一个C ++接口。 遗留库中的一些子例程遵循一个丑陋但可用的状态代码约定来报告错误,我使用这样的状态代码从我的C ++代码中抛出一个可读的exception:它工作得很好。 另一方面,有时遗留库会调用STOP (终止程序)。 即使条件可以恢复,它也经常这样做。 我想从C ++中捕获这个STOP ,到目前为止我一直没有成功。 以下代码很简单,但完全代表了手头的问题: Fortran遗留库fmodule.f90 : module fmodule use iso_c_binding contains subroutine fsub(x) bind(c, name=”fsub”) real(c_double) x if(x>=5) then stop ‘x >=5 : this kills the program’ else print*, x end if end subroutine fsub end module fmodule C ++接口main.cpp : #include // prototype for the external Fortran […]

静态编译共享库

我有一个带有一些自制函数的共享库,我将其编译到我的其他程序中,但是我必须将结束程序与我用来编译静态库的所有库相关联。 这是一个例子: 我在库中有函数foo ,它需要来自另一个库libbar.so的函数。 在我使用函数foo主程序中,我必须用-lbar标志编译它。 有没有办法可以静态编译我的库,所以它包含了其他库中的所有必需代码,我可以编译我的结束程序而不需要-lbar标志?

为什么LD_LIBRARY_PATH是BAD以及加载动态库的正确方法

所以,我有一个运行OpenBlas的程序,我想编译它。 链接过程如下所示: gcc -o prog prog.o -O3 -I/opt/OpenBLAS/include -L/opt/OpenBLAS/lib -lopenblas 到现在为止还挺好。 如果我删除-L选项,我在链接过程中出错 /usr/bin/ld: cannot find -lopenblas 使用-L所有链接都没有错误。 但是,当我尝试运行它时,我收到以下错误: ./prog: error while loading shared libraries: libopenblas.so.0: cannot open shared object file: No such file or directory 如果我将env变量LD_LIBRARY_PATH设置为/opt/OpenBlas/lib我可以运行该程序,但很多来源如http://xahlee.info/UnixResource_dir/_/ldpath.html认为这是一个不好的做法,我可以理解几乎所有的推理。 文章中提到的另一种方法(修改ld配置)也被认为是一种不好的做法。 最后,您可以在/usr/lib向库中添加符号链接。 最后两种方法的一个大问题是您需要sudo访问权限。 所以我的问题是如何在不使用LD_LIBRARY_PATH和sudo访问的情况下编译和运行链接到不在默认路径( /usr/lib )中的共享库的程序。 在文章中他们说你可以在二进制文件中“写”寻找共享库,但我不知道如何做( -L标志似乎没有这样做)。 我很感激,如果有人能解释这个问题,因为我一直在寻找各处,我很困惑(一些参考文献似乎表明标志’-L’应该这样做,但我不适合我)。 先感谢您。

如何在osx上使用clang编译共享库

源文件 rsetti::fastidio { /tmp }-> cat foo.c #include void ACFunction() { printf(“ACFunction()\n”); AGoFunction(); } 编译共享库 rsetti::fastidio { /tmp }-> clang -shared -o libfoo.so foo.c foo.c:4:3: warning: implicit declaration of function ‘AGoFunction’ is invalid in C99 [-Wimplicit-function-declaration] AGoFunction(); ^ 1 warning generated. Undefined symbols for architecture x86_64: “_AGoFunction”, referenced from: _ACFunction in foo-lFDQ4g.o ld: symbol(s) not […]

在调用dlclose时,共享库中的全局变量会发生什么变化?

如果通过dlopen和dlclose机制使用共享库(或DLL),并且如果创建的共享库有一些全局变量,其内存来自堆,那么当调用dlclose时这些变量和内存会发生什么? 如果在同一个进程中再次调用dlopen,那么行为是什么?

扩展动态链接共享库?

我是C的新人,很抱歉我缺乏知识(我的C-book非常庞大:) 我想扩展一个共享库(libcustomer.so)与封闭源,但公众已知api。 这样的事情可能吗? 将libcustomer.so重命名为liboldcustomer.so 创建一个扩展的共享库libcustomer.so(所以其他人隐式使用扩展的共享库) 通过-loldcustomer将liboldcustomer.so链接到我的扩展libcustomer.so中 将任何不是额外实现的方法直接转发给旧的“liboldcustomer.so” 我认为它不会那样工作(名称被编译成.so,不是吗?)。 但是替代方案是什么? 对于#4:是否有一般的方法来做到这一点,或者我是否必须编写一个名为旧的方法并转发呼叫(如何?)? 因为原始的libcustomer.so(= liboldcustomer.so)可能会不时发生变化,所有这些东西都应该动态地工作。 出于安全原因,我们的系统没有LD_PRELOAD(否则我会接受:()。 考虑扩展validation检查和一些更好的NPE处理。 在此先感谢您的帮助! 编辑: 我正在实现我的扩展,如答案中所示,但我目前有一个未处理的案例: 如何从扩展库“代理”结构? 例如我有这个: customer.h: struct customer; customer.c: struct customer { int children:1; int age; struct house *house_config; }; 现在,在我的customer-extension.c中,我正在编写customer.c的所有公共方法,但是如何“传递”结构? 非常感谢您的时间和帮助!

共享库中的error handling策略 – C.

我正在使用C编写跨平台共享库(在Linux中的.so和在Windows中的.dll )。目前,当出现错误时,库函数会返回正确的错误代码并将错误信息写入stderr 。 库函数还向stdout发送一些信息和调试消息。 这适用于基于控制台的客户端。 现在这个库将拥有使用C ++和wxWidgets编程的GUI的客户端程序。 我想知道处理错误并通知错误的最佳做法是什么? UI应用程序可以访问所有平台上的stdout和stderr数据吗? 我想的另一种方法是库初始化函数初始化一个具有函数指针的结构。 库上的所有函数都将采用此结构的实例并调用函数指针。 这样客户端可以选择打印消息的位置。 我想知道解决这个问题的明显方法是什么? 任何帮助都会很棒。

如何在C或C ++中获取/链接外部函数?

编辑:我想我应该澄清,如果重要的话。 我在AIX Unix机器上,所以我使用的是VAC编译器 – 没有gnu编译器。 结束编辑 我在C / C ++中相当生疏,所以请原谅我这是一个简单的问题。 我想从我的一些C程序中获取常用函数,并将它们放在共享库或共享对象中。 如果我在perl中这样做,我会将我的sub放在perl模块中,并在需要时使用该模块。 为了举个例子,假设我有这个function: int giveInteger() { return 1034; } 显然这不是一个现实世界的例子,但如果我想分享这个function,我将如何进行? 我很确定我有两个选择: 将我的共享函数放在一个文件中,并在编译时使用我的主程序进行编译。 如果我对共享function进行了更改,我将不得不重新编译我的主程序。 将我的共享函数放在一个文件中,并将其编译为共享库(如果我的条款正确),并将我的主程序链接到该共享库。 我对共享库所做的任何更改(在编译之后)都会在运行时集成到我的主程序中,而无需重新编译我的主程序。 我对这个想法是否正确? 如果是这样,我怎样才能完成这两种方法中的任何一种/两种方法? 我搜索了很多,我似乎找到了如何将自己的程序链接到其他人的共享库的信息,但不知道如何创建我自己的共享函数并以我可以在我自己的程序中使用它们的方式编译它们。 非常感谢! 布赖恩 编辑: 结论 谢谢大家的帮助! 我想我会在这篇文章中添加什么对我有用(对于AIX上的动态共享库),以便其他人可以受益: 我编译我的共享函数: xlc -c sharedFunctions.c -o sharedFunctions.o 然后使它成为共享对象: xlc -qmkshrobj -qexpfile=exportlist sharedFunctions.o xlc -G -o libsharedFunctions.so sharedFunctions.o -bE:exportlist 然后链接另一个程序: xlc -brtl -o […]

交叉编译器C中的二进制兼容性

我需要validation一些我怀疑的东西。 如果共享库(.dll)是用C语言编写的,那么使用C99标准并在编译器下编译。 说MinGw。 然后根据我的经验,它是二进制兼容的,因此可以从任何其他编译器使用。 说MS Visual Studio。 我根据自己的经验说,因为我不止一次成功地尝试过它。 但我需要validation这是否是一个规则。 另外我想问一下它是否确实如此,那么为什么用C语言完全用C语言编写的库,例如openCV不为每个不同的操作系统提供编译的二进制文件? 我知道明显的原因是设置所有编译时参数,但除此之外没有正确的吗? 编辑:我正在添加一个额外的问题,我认为这是原始的逻辑扩展。 这不是一个人如何去创建一个封闭的源库吗? 由于提供源的选项不在窗口中,因此给出二进制文件是唯一的选择。 在这种情况下,为尽可能多的体系结构提供二进制文件是理想的结果,C是在系统和编译器之间具有最佳可移植性的明显选择。 对?