내 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의 정적 라이브러리이지만 링크 할 수 없습니다. 이미 targetType
을 staticLibrary
에서 dub.json
으로 설정했습니다.
나는 또한 dmd
플래그 -m32mscoff
및 -betterC
더 buildOptions
setting 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 라이브러리를 연결합니까?