Tag: 共享库

将MATLAB中的指针参数传递给C-DLL函数foo(char **)

我正在编写一个从MATLAB调用的C-DLL。 是否可以使用const char **参数调用函数? 例如 void myGetVersion( const char ** ); C代码将是: const char *version=0; myGetVersion( &version ); 什么是相应的MATLAB-Code(如果可能的话)? 非常感谢你! PS:我认为这是帮助页面 ,但我找不到我的情况:-(

如何创建静态链接共享库

对于我的硕士论文,我正在尝试为ARM Cortex-M3嵌入式系统调整共享库方法。 由于我们的目标板没有MMU,我认为使用“普通”动态共享库是没有意义的。 因为.text是直接从flash执行的,并且.data在启动时被复制到RAM,所以我无法解决相对于代码的.data,因此GOT也是如此。 必须通过必须在链接时定义的绝对地址来访问GOT。 那么为什么不在链接时为所​​有符号分配固定的绝对地址……? 从“链接器和加载器”一书中我了解到“静态链接共享库,即库中程序和数据地址在链接时绑定到可执行文件的库”。 链接的章节描述了如何创建这样的库,并提供对Unix System V,BSD / OS的引用; 还提到了Linux和它的uselib()系统调用。 不幸的是,本书没有提供如何实际创建诸如工具和/或编译器/链接器开关之类的库的信息。 除了那本书之外,我几乎没有找到任何关于这些“野外”图书馆的信息。 我在这方面唯一发现的是Linux的预链接 。 但是,由于这是在“正常”动态库上运行,而不是我正在寻找的。 我担心这些库的使用非常具体,因此不存在创建它们的常用工具。 虽然在这种情况下提到的uselib()系统调用让我感到疑惑。 但是我想确保在开始破解我自己的链接器之前我没有忽略任何东西……;)那么有人能给我更多关于这些库的信息吗? 此外,我想知道是否有任何gcc / ld开关链接和重定位文件,但保留文件中的重定位条目 – 以便它可以重新重新定位? 我找到了“-r”选项,但完全跳过了重定位过程。 有没有人有想法? 编辑: 是的,我也知道链接器脚本。 使用gcc libfoo.c -o libfoo -nostdlib -e initLib -Ttext 0xdeadc0de我设法得到某种链接和重定位的目标文件。 但到目前为止,我还没有找到任何可能将主程序与此链接并将其用作共享库的可能性。 (链接动态共享库的“正常方式”将被链接器拒绝。)

在C中使用dlopen时,是否有一种优雅的方法来避免dlsym?

如果在运行时满足特定条件,我需要动态打开共享库lib.so 该库包含~700个函数,我需要加载它们的所有符号。 一个简单的解决方案是定义lib.so包含的所有符号的函数指针,使用dlopen加载库,最后使用dlsym获取所有符号的地址。 但是,考虑到函数的数量,实现此解决方案的代码非常麻烦。 我想知道是否存在更优雅和简洁的解决方案,可能适当使用宏来定义函数指针。 谢谢!

我可以在C程序中使用C ++创建的共享库吗?

我正在使用C创建程序。但是,我需要使用许多只有C ++的API。 那么,我是否有可能在C ++中创建共享对象,然后使用C访问其function? 我将传递和返回的唯一数据是C兼容的数据类型。 转换或迁移到cpp不是一个选项。 如果无法连接这些代码,我如何从C ++代码获取信息到C代码? 我尝试从C调用C ++函数,但是当我包含时,在链接期间出现错误。 所以当我从C调用C ++函数时,我应该只使用那些与C编译器兼容的代码吗? C ++头文件cppfile.hpp #ifndef CPPFILE_H #define CPPFILE_H #ifdef __cplusplus extern “C” { #endif extern int myfunction(const char *filename); #ifdef __cplusplus } #endif #endif C ++文件cppfile.cpp #include “cppfile.hpp” #include int myfunction(const char *filename) { String S(filename); return 0; } C文件cmain.c #include “cppfile.hpp” int main(int argc, […]

GCC创建共享对象而不是可执行二进制文件

我有一个正在建设的图书馆。 当我运行以下任何一个时,我的所有对象都会连续编译和链接: ar rcs lib/libryftts.a $^ gcc -shared $^ -o lib/libryftts.so 在我的Makefile中。 我也能够成功地将它们安装到/usr/local/lib当我用nm测试文件时,所有的function都在那里。 我的问题是当我运行gcc testing/test.c -lryftts -o test && file ./test或gcc testing/test.c lib/libryftts.a -o test && file ./test时说: test: ELF 64-bit LSB shared object而不是test: ELF 64-bit LSB executable正如我所料。 我究竟做错了什么?