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

2024-03-09

EDIT:我想我应该澄清一下,以防万一。我使用的是 AIX Unix 机器,所以我使用 VAC 编译器 - 没有 gnu 编译器。End edit


我对 C/C++ 很生疏,所以如果这是一个简单的问题,请原谅我。

我想从我的一些 C 程序中取出常用函数,并将它们放入共享库或共享对象中。如果我在 perl 中执行此操作,我会将我的 subs 放入 perl 模块中,并在需要时使用该模块。

举个例子,假设我有这个函数:

int giveInteger()
{
    return 1034;
}

显然这不是一个现实世界的例子,但如果我想共享该功能,我将如何进行?

我很确定我有两个选择:

  1. 将我的共享函数放在一个文件中,并在编译时将其与我的主程序一起编译。如果我对共享函数进行更改,我将不得不重新编译我的主程序。
  2. 将我的共享函数放入一个文件中,并将其编译为共享库(如果我的术语正确的话),并将我的主程序链接到该共享库。我对共享库所做的任何更改(编译后)都将在运行时集成到我的主程序中,而无需重新编译我的主程序。

我的想法正确吗?

如果是这样,我怎样才能完成这两种方法中的一个/两个?我搜索了很多,似乎找到了如何将我自己的程序链接到其他人的共享库的信息,但没有找到如何创建我自己的共享函数并以可以在我自己的程序中使用它们的方式编译它们。

非常感谢!

Brian


EDIT:

结论

Thanks everyone for your help! I thought I would add to this post what is working for me (for dynamic shared libraries on AIX) so that others can benefit:

我编译我的共享函数:

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 mainProgram mainProgram.c  -L. -lsharedFunctions

另一条评论帮助我找到了这个链接,这也有帮助:http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/topic/com.ibm.vacpp7a.doc/proguide/ref/compile_library.htm http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/topic/com.ibm.vacpp7a.doc/proguide/ref/compile_library.htm

再次感谢所有帮助过我的人!


是的,你是对的。第一个称为静态库,而第二个称为共享库,因为代码在编译时并未绑定到可执行文件,而是每次加载程序时都会绑定到可执行文件。

静态库

按如下方式编译您的库的代码:

gcc -c *.c

The -c告诉程序不要链接目标文件,而只是为您留下每个目标文件.c已编译的文件。现在,将它们归档到一个静态库中:

ar rcs libmystuff.a *.o 

man ar会告诉你 rcs 选项的含义。现在,libmystuff.a 是a存档文件(您可以使用一些 zip 文件查看器打开它),其中包含这些目标文件以及每个目标文件的符号索引。您可以将其链接到您的程序:

gcc *.c libmystuff.a -o myprogram

现在,您的程序已准备就绪。请注意,静态库在命令中出现的顺序很重要。看我的链接顺序 https://stackoverflow.com/questions/45135/linker-order-gcc#409470回答。

共享库

对于共享库,您将使用以下命令创建库

gcc -shared -o libmystuff.so *.c

这就是所需要的,libmystuff.so 现在是shared o对象文件。如果您想将程序链接到它,则必须将其放入目录中列出的目录中/etc/ld.so.conf文件,或者由-L切换到 GCC,或列在 LD_LIBRARY_PATH 变量中。链接时,您将lib前缀和.so您告诉 gcc 的库名称的后缀。

gcc -L. -lmystuff *.c -o myprogram

在内部,gcc 只会将您的参数传递给 GNU 链接器。您可以使用以下命令查看它传递的参数-###选项:Gcc 将打印提供给每个子进程的确切参数。

有关链接过程的详细信息(某些内容是如何在内部完成的),请查看我的Linux GCC 链接器 https://stackoverflow.com/questions/332554/linux-gcc-linker#332572 answer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C 或 C++ 中获取/链接外部函数? 的相关文章

  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行

随机推荐