2017-03-24 6 views
0

그래서이 패키지는 나중에 멋진 것들을하기 전에 테스트하기 위해 함께 사용한 간단한 프로젝트입니다. 궁극적 인 목표는 프로그램이 멋진 dll kung fu를 통해 모듈성을 처리 할 수있게 만드는 것입니다.Ada에서 사용자 정의 dll을 어떻게 연결합니까?

그러나 아기 단계. 지금은 그저 사물을 연결시키고 싶습니다. 나는 알고있다,

package body Adder is 

    function Add(A : Integer; B : Integer) return Integer is 
    begin 
     return A + B; 
    end Add; 

end Adder; 

흥미로운 :

package Adder is 

    function Add(A : Integer; B : Integer) return Integer; 

end Adder; 

그리고 각각의 Adder.adb :

여기에 내가 Adder.ads 있습니다. 나는이 작업을 수행하고, 그들 중 누구도 동의하지 않지만 this one에서 큐를 복용하는 방법에 대한 몇 가지 자습서를 본 적이

, 나는 이러한 명령을 함께했다 :

gnatmake -c Adder.adb 
gcc -shared -shared-libgcc -o Adder.dll Adder.o 

적어도 를 생성이 dll. 나는 그것이 실제로 작동하거나 문제점이 주 EXE와 함께 발생하는 경우 생성합니다.

이제 기본 실행 파일 인 gnat가 모든 파일을 별도의 디렉토리에 보관하여 .ali 및 .o 파일을 속이고 사용하려고 시도하지 않았습니다. 그런 다음 빌드하기 전에 dll을 디렉토리에 복사합니다. 나는이 여러 가지 방법으로 여러 가지 시도를 시도했지만 몇 가지 다른 오류가 있었지만 지금 당장 가지고있는 것이있다.

Main.adb : 지금

with Adder_Spec; use Adder_Spec; 
with Ada.Text_IO; use Ada.Text_IO; 

procedure Main is 
begin 
    Put_Line(Integer'Image(Add(3,4))); 
end Main; 

야호 가장 쓸모없는 프로그램. 지금, 나는이 DLL에 대한 사양을 했어야 해요 알고, 나는 aforewith'd Adder_Spec.ads 함께했다 :

package Adder_Spec is 

    function Add(A : Integer; B : Integer) return Integer; 

private 

    pragma Import(Ada, Add, "Add"); 

end Adder_Spec; 

를 자, 내가이 다른 방법의 무리 해봤 말했듯이, 때로는 세 번째 가져 오기 매개 변수를 생략하고 다른 시간은 가져 오기를 생략하고 가져 오기는 유지하지만 개인 부분으로 분리하지 않을 수도 있습니다. 나는 또한 컴파일 명령을 사용하여 여러 가지 방법을 연주했는데, 여기에서 가장 최근의 것 :

gnatmake Main.adb -bargs -shared -largs -lAdder 

를이 오류에 " '추가'에 대한 정의되지 않은 참조를"밖으로 뱉어이 특정 명령과 함께. -v 플래그를 추가하면 더 유용한 정보를 제공하지 않습니다.

gnatmake --help를 검사하면 차이가 나는 경우 기본 모드가 gnat 2012임을 알 수 있습니다. 아마도 2005 년과 95 년 플래그로 컴파일을 시도 했으므로 그렇게해서는 안됩니다.

그럼 ... 누구나 잘 아는 사람이 문제를 해결할 수 있습니까? 미리 감사드립니다.

+0

기술적으로 이것은 GNAT 질문이며 Ada 질문이 아닙니다 (그러나 나는 "ada"태그를 유지하는 것이 가장 합리적이라고 생각합니다). –

+1

'gcc -shared -shared-libgcc -o Adder.dll -Adder.o'라고 할 때, 당신은 단지'Adder.o'를 의미해야한다고 생각합니까? –

+0

@SimonWright 네, 잘 잡으세요. – Devsman

답변

3

는, 당신은 그것을 구축 할 때

package Adder is 
    function Add(A : Integer; B : Integer) return Integer; 
    pragma Export (Ada, Add, "Add"); 
end Adder; 

을 말해야한다.

생성 된 Add에 대한 GNAT의 기본 링커 이름은 (내 생각) adder__add입니다. nm Adder.o을 사용하여 무엇이 보이는지 볼 수 있어야합니다.

+0

AFAIK pragma 내보내기는 가져온 계약 정의 직후에 선언해야합니다. 범위와 관련하여 애매한 점이 없습니다. 수출이 사적인 부분에서 선언되고 공공 부분에서 계약됨에 따라 어쨌든 예상되는 행동은 무엇입니까? 그런 건축이 필요한 이유는 무엇입니까? – LoneWanderer

+0

@LoneWanderer - [ARM05 B.1 (51)] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-B-1.html#p51)을 확인하면 수출은 사적인 부분에서 선언되었다. 아마도 함수 호출의 결과로 초기화 된 변수를 선언하여 pragma를보기 전에 서브 프로그램을 사용했다면 문제가있을 수 있습니다. 위의 예제와 위의 아이디어는 실제로 알 필요가없는 사람들의 눈에서 지저분한 세부 사항을 숨기는 것입니다. 요즘 코스의 'Convention','Export','External_Name' 등의 측면은 당연한 것입니다! –

+0

당신, 사이먼. 나는 그것이 그것을 짐작해야했다. – Devsman

0

AdaCore의 "Ada Plug-ins and Shared Libraries"(part 1, part 2)의 지침을 따르는 것이 좋습니다.

여기에 설명 된 기술을 사용했지만 매우 잘 작동했습니다.당신이 DLL을 가져올 때

package Adder_Spec is 
    function Add(A : Integer; B : Integer) return Integer; 
private 
    pragma Import(Ada, Add, "Add"); 
end Adder_Spec; 

말하려면

+0

나는 확실히 이것을 보게 될 것이다. 감사! – Devsman