将D项目编译为库-依赖关系会发生什么?

时间:2019-10-01 07:27:45

标签: c gcc d dmd dub

好,这是我的问题:

我有一个正在运行的DUB项目,该项目可以产生一个应用程序。我决定我还想要在dub.json文件中进行“库”配置:

"configurations": [
    {
        "name": "application",
        "targetType": "executable"
    },
    {
        "name": "library",
        "targetType": "library",
    }
],

因此,现在当我使用dub build --config=library构建项目时,它将在同一目录中生成一个libXXXX.a文件。

到目前为止,很好。

我尝试使用此库(实际上是一个来自测试C应用程序的标记为extern "C"的微小测试功能)。

因此,我使用gcc -c ctest.c编译我的C应用程序,然后像dmd libMYLIBRARY.a ctest.o一样将它们链接在一起。

现在,问题出在这里:

在最后一步中,链接器抱怨缺少许多符号-全部来自外部依赖项(2个目标文件和几个.a库),通常在将项目构建为应用程序时会被链接。

所以,问题是...我该如何解决?

我的意思是...我应该仅将我的测试C应用程序与所有原始依赖项链接起来(这当然不会使该库具有很高的可移植性),或者有什么解决办法,以便任何人都可以使用我的库,仅通过链接到我的libXXXXX.a文件?

1 个答案:

答案 0 :(得分:3)

  

我应该将我的测试C应用程序与所有原始依赖项链接起来吗(当然,这不能使库非常可移植)

这是“技术上正确的”答案。这样做的原因是,否则,如果C应用程序想要使用另一个D库,而该D库在其依赖关系中包含某个包,该包在您的库中也是一个依赖关系,并且如果它以相同的方式链接(包括其所有依赖关系,请参见参考资料)。其静态库文件),则此依赖项将在链接器输入中发生两次。即使您告诉链接器放弃一个副本,也可能会出现问题,因为依赖项是单独的不兼容版本,等等。(请注意,正在进行的D SAOC project会处理该问题。)

如果您假设C程序将使用的唯一D库是您的Dub包,那么可以想像地创建一个包含所有依赖项的静态库,尽管它可能需要包括D标准库和运行时,好吧。