c - 将 D 项目编译为库 - 依赖项会发生什么?
问题描述
好的,这是我的问题:
我有一个工作的 DUB 项目,它产生一个应用程序。我决定在我的dub.json
文件中还需要一个“库”配置:
"configurations": [
{
"name": "application",
"targetType": "executable"
},
{
"name": "library",
"targetType": "library",
}
],
因此,现在当我使用 构建项目时dub build --config=library
,它会libXXXX.a
在同一目录中生成一个文件。
到目前为止,一切都很好。
我尝试使用这个库(实际上是一个标记为extern "C"
来自测试 C 应用程序的小测试函数)。
因此,我使用编译我的 C 应用程序gcc -c ctest.c
,然后将它们链接在一起,如dmd libMYLIBRARY.a ctest.o
.
现在,问题来了:
在最后一步中,链接器抱怨缺少许多符号- 所有符号都来自外部依赖项(2 个目标文件和几个.a
库),这些符号通常在将项目构建为应用程序时链接。
所以,问题是......我该如何解决这个问题?
我的意思是...我是否应该将我的测试 C 应用程序与所有原始依赖项链接起来(诚然,这不会使库非常便携),或者有什么办法可以解决它,以便任何人都可以使用我的库,只有通过链接反对我的libXXXXX.a
档案?
解决方案
我是否应该将我的测试 C 应用程序与所有原始依赖项链接起来(诚然,这不会使库非常便携),
这是“技术上正确”的答案。这样做的原因是,否则,如果 C 应用程序想要使用另一个 D 库,该库在它的依赖项中有一些包也是你的库中的一个依赖项,并且如果它以相同的方式链接(包括它在它的静态库文件),这种依赖将在链接器输入中出现两次。即使您告诉链接器丢弃一份副本,也可能会由于依赖于不同的不兼容版本等而出现问题。(请注意,有一个正在进行的 D SAOC 项目来处理这个问题。)
如果您假设 C 程序将使用的唯一 D 库是您的 Dub 包,那么您可以想象创建一个包含所有依赖项的静态库,尽管它可能还需要包含 D 标准库和运行时。
推荐阅读
- ruby-on-rails - Google::Apis::ClientError: 禁止:使用 ruby google api 使用服务帐户调用时调用者没有权限
- flutter - 颤动代码绘制屏幕下方的矩形底线 - 为什么(附示例)
- sharepoint - PowerShell 删除 14 天前的大型 SharePoint 列表项
- javascript - 跨多个磁盘驱动器的文件系统 I/O 中的 Node.js 性能:工作线程与否?
- android - 如何在运行时在android中查看曲线
- python - 即使代码看起来没问题,Django 表单也不会呈现
- javascript - 如果函数有参数,如何删除事件监听器?
- python - 使用beautifulsoup如何获得Net Seller
- python - 使用 Pandas Python 在某些列相同时合并行
- nuxt.js - 如何在 Nuxt 中添加“文本/javascript”