2016-10-13 4 views
2

내 D 라이브러리 (더빙을 사용함)를 C++ 응용 프로그램과 정적으로 연결하고 싶습니다.더빙을 사용하여 C++ 연결 가능 정적 라이브러리

예를 성공적으로 수동으로 연결하려면 the instructions on the wiki을 따라갔습니다.

그러나 더빙을 사용하는 자체 라이브러리가 있으며 출력 할 방법을 알아낼 수 없습니다. cl.


것은 내가 무슨 뜻인지 보여 드리죠 (예제 코드 from the wiki하지만 더빙으로 추가) :

프로젝트 디렉토리 :

E:\Projects\foo 
│ main.c 
│ 
└───libadd 
    │ dub.json 
    │ libadd.lib 
    │ 
    └───source 
      main.d 

을 main.c :

#include <stdio.h> 

// Defined in dlib.d 
int add(int, int); 

int main(int argc, char ** argv) { 
    int result = add(40, 2); 
    printf("The result is: %i\n", result); 

    return 0; 
} 

libadd/dub.json :

{ 
    "name": "libadd", 
    "targetType": "staticLibrary", 
    "mainSourceFile": "libadd.d", 
    "buildOptions": [ 
     "verbose" 
    ] 
} 

libadd/소스/libadd.d :

module libadd; 

extern (C) int add(int a, int b) { 
    return a + b; 
} 

// Only needed on Linux. 
extern (C) void _d_dso_registry() {} 

컴파일 및 위키에서 사용 지침을 연결 잘 작동합니다 :

e:\Projects\foo> dmd -c -v -m32mscoff -betterC libadd/source/libadd.d 
binary C:\opt\D\dmd2\windows\bin\dmd.exe 
version v2.071.1 
config C:\opt\D\dmd2\windows\bin\sc.ini 
parse  libadd 
importall libadd 
import object  (C:\opt\D\dmd2\windows\bin\..\..\src\druntime\import\object.d) 
semantic libadd 
semantic2 libadd 
semantic3 libadd 
code  libadd 
function libadd.add 
function libadd._d_dso_registry 

e:\Projects\foo> cl /nologo /Fefoo.exe main.c libadd.obj 
main.c 

e:\Projects\foo> foo.exe 
The result is: 42 

하지만 더빙으로 어떻게 할 수 있습니까? dmd을 수동으로 컴파일하는 동안 .obj이 생성되는 동안 dub.lib을 생성합니다. Google 교수에 따르면 .lib은 Windows의 정적 라이브러리이지만 링크 할 수 없습니다. 이미 targetTypestaticLibrary에서 dub.json으로 설정했습니다.

나는 또한 dmd 플래그 -m32mscoff-betterCbuildOptionssetting in dub.json 대응 한 것으로 나타났습니다 없습니다. 하지만 어떻게 보상할지 모르겠다.

e:\Projects\foo> cd libadd 

e:\Projects\foo\libadd> dub 
Performing "debug" build using dmd for x86. 
libadd ~master: building configuration "library"... 
binary C:\opt\D\dmd2\windows\bin\dmd.exe 
version v2.071.1 
config C:\opt\D\dmd2\windows\bin\sc.ini 
parse  libadd 
importall libadd 
import object  (C:\opt\D\dmd2\windows\bin\..\..\src\druntime\import\object.d) 
semantic libadd 
semantic2 libadd 
semantic3 libadd 
code  libadd 
function libadd.add 
function libadd._d_dso_registry 
library .dub\build\library-debug-windows-x86-dmd_2071-2DA862E35C1BEDC80780CBC1AB5F7478\libadd.lib 
Target is a library. Skipping execution. 

e:\Projects\foo\libadd> cd .. 

e:\Projects\foo> cl /nologo /Fefoo.exe main.c libadd/libadd.lib 
main.c 
libadd/libadd.lib : fatal error LNK1136: invalid or corrupt file 

어떻게 정적 C++ 응용 프로그램과 함께, 더빙을 사용하여 내 D 라이브러리를 연결합니까?

답변

1

몇 가지 문제가 발생하면 알아 냈습니다.

밝혀졌습니다. -m32mscoff이 중요하며 32 비트에 필요합니다. 64 비트 컴파일 및 링크는 그대로 작동합니다.

dub.json에 추가 -m32dmd를 전달

"dflags-windows-x86-dmd": [ 
    "-m32mscoff" 
] 

에도 dub하지만, 그것은 필요한 -m32mscoff을합니다. 이제 정상적으로 cl에 연결할 수 있습니다.

관련 문제