Tag: 共享库

C pluginsystem:符号查找错误

我正在编写一个插件系统,它与其他3个模块分开: plugin_system.c – 系统的核心 list.c – 包含插件存储的链接列表实现 plugin_interface.h – 包含插件所需的声明,没有与之关联的源文件 plugin_interface.h只包含类型和函数: extern int plugin_register(PluginManager *plug_manager, const char *name, Plugin *plug); 这是在plugin_system.c中定义的 加载插件时,插件系统会查找函数init_plugname()并调用它,该函数必须调用plugin_register来注册插件。 该程序使用复杂的递归Makefile编译(不是最好的主意),但我尝试实现的是: 我在主程序文件夹中编译插件系统对象,然后将其与主程序链接。 从make执行: gcc -Wall -O2 -std=gnu99 -D DEBUG -g -fPIC -c -o /home/kowa/code/reseaux/projet/ringo/c/bin/list.o list.c gcc -Wall -O2 -std=gnu99 -D DEBUG -g -fPIC -c -o /home/kowa/code/reseaux/projet/ringo/c/bin/plugin_system.o plugin_system.c 插件使用gcc -fPIC -c -o plugname.o plugname.c […]

代码目录结构 – 库设计

下面是代码结构,其中stack , Queue , tree文件夹代码依赖于list文件夹代码, ../Computing >ls HashTable list Queue recursion stack tree list tree/rootedTree文件夹中复制的list文件夹,不像推荐的方法包含依赖的头文件, 这里提到的, ../Computing/tree/rootedTree >ls lcrsImpl.c list main.c multiWalkImpl.c tree.h 这是rootedTree文件夹的不完整代码。 为避免代码重复List文件夹,如何维护代码结构?

如何通过SWIG创建已包装库的扩展?

我有一个图书馆。 它是通过SWIG封装的。 我想创建一个插件来扩展它。 插件需要一个来自已经包装的库的类来运行类似void init( oldT old); 。 库使用Java和c#。 现在这个插件也将从那里使用。 库和插件是单独的dll。 如何在为插件创建绑定时已经拥有oldT类型的SWIG?

我是否需要明确包含共享库中使用的公共头文件(在包含路径文件夹中)?

我正在使用共享库,比如shr.so 这有一些头文件,比如shr_struct.h ,我需要在我的程序中使用的结构,比如shr_struct.h 。 我是否需要在include路径中保留shr_struct.h的副本, shr_struct.h在shr_struct.h中的shr_struct.h中声明结构类型的对象?

gcc:无法从目标文件创建.so

我试图从* .o文件创建.so动态库并面临下面的问题。 日志: [nptemp-static]$ gcc -shared *.o -o libexample.so /usr/bin/ld: bindings_hubbub_parser.o: relocation R_X86_64_32 against `.rodata.str1.8′ can not be used when making a shared object; recompile with -fPIC bindings_hubbub_parser.o: could not read symbols: Bad value collect2: ld returned 1 exit status 任何的想法? 我是否需要使用指定的选项重新编译我的整个源代码? 实际上,我不知道我编译的源代码,因为所有的源代码都是开源的,我按照README中的说明下载和编译。

c模块中的命名空间或包

我是初学者级别的程序员,来自高级语言,感觉像c是扁平结构。 有没有一种模拟包的方法,所以我可以有一个干净的命名空间,而不需要前缀。 嵌套结构是我正在看的。 它是如何与第三方外部库一起工作的,当名称冲突时会发生什么,或者它是如何分开的。 如果我要构建一个库或一个与libs链接的多模块应用程序,那么每个模块可以有一个与另一个模块相同的变量,函数或结构名称。 此外,如果您链​​接两个名称冲突的第三方库(.a文件等),您如何解决此类冲突。

DLL更新后重建EXE?

我看到主题和微软官方文档( https://docs.microsoft.com/en-us/cpp/build/determining-which-exporting-method-to-use ),说我们在向我们的dll添加导出function之后,我们必须重建DLL(逻辑) 和 EXE。 我不明白他们为什么这么说,经过测试后不是这样,我不需要在我添加函数到dll之后重建我的exe。 我的函数使用__declspec导出,并且有基本的C函数。 他们(链接)建议我们使用带有序数的.def文件来重建,但即使没有这个.def文件,我也不必重建。 __declspec是否也使用序数来链接dll函数或它是否使用函数命名? 你能解释一下他们为什么这么说,我哪里错了? 谢谢

在共享库和应用程序之间传输数据

我有共享库,我在那里进行一些数据生成/处理,我已经编写了一些API和应用程序来访问它们并传输数据。 / * ** * ** * ** * **** 申请 * ** * ** * ** / char* data1; char* data2; genratedCamData(1, char* data1 , char *data2); printf(” data1 %s “,data1); printf(” data2 %s “,data2); free(data2); / * ** * ** * ** * ** 内部图书馆 ** * ** * ** * ** * […]

链接到Pelles C中的DLL

我有一个218KB .dll和一个596KB .so文件,两个名字相同。 我想链接到.dll以避免链接器返回的“未解析的外部符号”错误,但我找不到链接到DLL文件的方法。 根据Pelles C论坛主题 ,我需要使用.def文件来创建.lib …但是我没有.def文件。 这个论坛主题展示了如何使用polink创建.lib ,所以我运行了polink /? 获得更多选择。 我注意到了一个/MAKEDEF选项,但是使用.dll和.so运行它会给出“没有指定库文件”的致命错误。 我一直试图这样做三个小时,而且我没有想法。 我已经到了我的网络搜索发出我自己的帮助请求的程度。 必须有办法做到这一点……我怎样才能链接到.dll ?

共享库编译,但具有未定义的符号

我得到的东西如下: Exception in thread “main” java.lang.UnsatisfiedLinkError: no viewerNativeDLL in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1028) at viewer.SarBufferedImage.(SarBufferedImage.java:356) at viewer.viewerJPanel.(viewerJPanel.java:34) at viewer.ViewerView.initComponents(ViewerView.java:457) at viewer.ViewerView.(ViewerView.java:33) at viewer.ViewerApp.main(ViewerApp.java:21) 这是即使我已将LD_LIBRARY_PATH设置为我构建共享对象的路径。 我是否构建了错误的共享对象? 这是我用来构建共享库的makefile: CPP = g++ CFLAGS = -O3 -Wall -fopenmp -fPIC INC = -I ../../VC/readers/ -I../../VC/writers -I../../VC/common/ -I /home/dcole/software/xerces-c-3.1.1/src -I /home/dcole/software/java/jdk1.6.0_23/include -I /home/dcole/software/java/jdk1.6.0_23/include/linux LIB2 = -L/usr/lib64/ -L../../lib/IDT.a -L../../lib/Linux/libxerces-ca […]