好,这是我的问题:
我有一个正在运行的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
文件?
答案 0 :(得分:3)
我应该将我的测试C应用程序与所有原始依赖项链接起来吗(当然,这不能使库非常可移植)
这是“技术上正确的”答案。这样做的原因是,否则,如果C应用程序想要使用另一个D库,而该D库在其依赖关系中包含某个包,该包在您的库中也是一个依赖关系,并且如果它以相同的方式链接(包括其所有依赖关系,请参见参考资料)。其静态库文件),则此依赖项将在链接器输入中发生两次。即使您告诉链接器放弃一个副本,也可能会出现问题,因为依赖项是单独的不兼容版本,等等。(请注意,正在进行的D SAOC project会处理该问题。)
如果您假设C程序将使用的唯一D库是您的Dub包,那么可以想像地创建一个包含所有依赖项的静态库,尽管它可能需要包括D标准库和运行时,好吧。