我正在Visual D下开发一个项目。在解决方案中,我有一个库项目和一个可执行项目。问题是如何在可执行项目中链接库项目(从那里使用模块)?
我尝试在项目设置中添加库搜索路径但是没有生效,编译器仍然写错了:
Error: module TestObject is in file 'Library\Core\TestObject.d' which cannot be read D:\dev\projects\d\MySolution\Executable\main.d
更新1 经过一些实验,我发现问题在于编译器链接器。我安装了Xamarin Studio,添加了lib和可执行项目,检查了lib项目作为exectutable项目的依赖项,Xamarin Studio发现了(!!!)模块和来自lib项目的命名空间,但是编译器仍然写了那个愚蠢的错误。在Xamarin构建日志中存在lib二进制文件的完整限定路径。 (供参考,我使用的是Windows 7 x86)
更新2 我将项目推送到GitHub,如果你想尝试编译它 - 欢迎你。
更新3 我已经在新的Ubuntu 13.10上测试了MonoDevelop中的编译,但仍然存在错误。我认为这可能是我的文件结构或项目结构的问题......
答案 0 :(得分:2)
您需要一个.d文件,其中包含所有函数原型和类型,如C头文件。在该文件中,您可以添加一行pragma(lib, "TestObject");
来告诉编译器它需要与该模块链接。我相信在标准的-I导入路径中搜索模块,因此请尝试在那里添加模块路径。
答案 1 :(得分:2)
如果我理解正确,你在解决方案中有两个项目,并希望exe项目自动链接到lib项目?您只需在解决方案查看器中右键单击exe项目,然后将lib添加为Build Dependancy。
答案 2 :(得分:0)
我发现问题在于文件结构。出于某些奇怪的原因,在D中,您无法创建具有相同模块名称的嵌套项目,如
核心\ MyClass.d:
module Core.MyClass;
class MyClass {
//some stuff
}
然后使用它:
import Core.MyClass;
因为当你链接一个lib时,它的命名空间将在你的全局命名空间中混合,但是不会遵循模块结构。将遵循模块结构的文件结构。这发生在所有编译器( dmd , dmd2 , ldc2 , gdc )上。这很奇怪,因为 C#或 ActionScript 允许这样做,这是正常的逻辑。任何想法如何组织如下的结构?
import Root.Sub.Target;