未定义对gnat的'do_varargs'的引用。

问题描述 投票:0回答:1

编译后,当我尝试用win32ada 2017和GNAT 2017构建我的DLL时,它发出了一个错误。

gnatlink <ali\file> -o <jnk\file> -mdll -Wl,base-file,<base\file>  
win32-winuser.o:win32-winuser.adb:(.text+0xa62): undefined reference to 'do_varargs'  
win32-winuser.o:win32-winuser.adb:(.text+0x15be): undefined reference to 'do_varargs'  
collect2.exe: error: ld returned 1 exit status  
gnatlink: error when calling C:\GNAT\2017\bin\gcc.exe

你知道为什么gnatlink会发出这个错误吗?

编辑 :

fichier pour la compilation situé dans un dossier :

@echo on

set GNAT_PATH=C:\GNAT\2017
set gnatbin=%GNAT_PATH%\bin
set winada=%GNAT_PATH%\lib\win32ada

set path=%gnatbin%;%path%;

set INTERFACE_DLL=..

set obj=%INTERFACE_DLL%\obj

set GCCARGS=-c -g -O3 -mfentry -fomit-frame-pointer -gnatf 
set GNATMAKEARGS=-gnatwu -v -gnato -I%winada% 

cd %INTERFACE_DLL%\%obj%
%gnatbin%\gnatmake %GNATMAKEARGS% ..\hello_dll.adb  -cargs %GCARGS%

Le fichier pour la création de la DLL :

gnatdll -k -d hello_dll.dll obj\hello_dll.ali

Je ne peux pas afficher ici mon fichier pour lequel j'ai produit l'erreur mais j'ai reproduit sur des fichiers plus simples ci-dessous : le fichier adb.

with System;
use System;

with Win32;
with Win32.Windef;
with Interfaces.C.Strings;
with Win32.Winuser;
package body HELLO_DLL is
    procedure Report is 
          Result     : Win32.Int         := 0;
          H_Wnd      : Win32.Windef.Hwnd := Null_Address;  
          Lp_Text    : Win32.Lpcstr      := Win32.To_Pcstr (Interfaces.C.Strings.New_String ("Hello World"));  
          Lp_Caption : Win32.Lpcstr      := Win32.To_Pcstr (Interfaces.C.Strings.New_String ("Hello World 2"));  
          U_Type     : Win32.Uint        := 0;  

   begin
      Result := Win32.Winuser.Messagebox (H_Wnd, Lp_Text, Lp_Caption, U_Type);
    end Report;
end HELLO_DLL;

广告文件

   with Interfaces.C;
    package HELLO_DLL is

    procedure Report;             
   end HELLO_DLL;
ada gnat
1个回答
0
投票

你好:-) 似乎你缺少了一个关于 win32ada 在你 gnatdll 参数。你可能想试试这个(注意最后三个附加参数)。

gnatdll -k -d hello_dll.dll obj\hello_dll.ali -I"C:\GNAT\2017\lib\win32ada.relocatable" -largs -lwin32ada

然而,我认为使用 GNAT 项目文件创建 DLL 比使用 gnatdll. 根据你的例子(我稍微修改了一下),我从下面的文件和命令行一次性创建了一个DLL。这个 lib 如果构建成功,目录下将包含一个DLL。

> gprbuild -p -XWIN32ADA_BUILD=relocatable -P .\hello.gpr
Setup
   [mkdir]        object directory for project Hello
   [mkdir]        library directory for project Hello
Compile
   [Ada]          hello.adb
Build Libraries
   [gprlib]       hello.lexch
   [bind SAL]     hello
   [Ada]          b__hello.adb
   [link library] libhello.dll

sshello.ads

package Hello is

   procedure Initialize
     with Export, Convention => C;

   procedure Finalize
     with Export, Convention => C;

   procedure Say_Hello
     with Export, Convention => C;

end Hello;

sshello.adb

with System; use System;
with Interfaces.C.Strings;

with Win32;
with Win32.Windef;
with Win32.Winuser;

package body Hello is

   ----------------
   -- Initialize --
   ----------------

   procedure Initialize is
      procedure helloinit with Import;       --  Generated by binder.
   begin
      helloinit;
   end Initialize;

   --------------
   -- Finalize --
   --------------

   procedure Finalize is
      procedure hellofinal with Import;      --  Generated by binder.
   begin
      hellofinal;
   end Finalize;

   ---------------
   -- Say_Hello --
   ---------------

   procedure Say_Hello is

      package C_Str renames Interfaces.C.Strings;

      C_Text    : C_Str.chars_ptr := C_Str.New_String ("Hello World!");
      C_Caption : C_Str.chars_ptr := C_Str.New_String ("A Hello World Dialog.");

      Result : Win32.Int := 0;

   begin      
      Result := Win32.Winuser.Messagebox 
        (hWnd      => Null_Address,
         lpText    => Win32.To_Pcstr (C_Text),
         lpCaption => Win32.To_Pcstr (C_Caption),
         uType     => 0);

      --  Don't forget to free the allocated strings.
      C_Str.Free (C_Text);
      C_Str.Free (C_Caption);      

   end Say_Hello;

end Hello;

hello.gpr

with "win32ada";

library project Hello is

   for Library_Kind use "dynamic";   
   for Library_Name use "hello";
   for Library_Interface use ("hello");

   --  The "Library_Auto_Init" option is set to False. This will make the binder
   --  generate initialization and finalization functions (in this case
   --  "helloinit" and "hellofinal"). It's a good habit to wrap these
   --  and call these wrappers from the client application.   

   for Library_Auto_Init use "False";

   for Library_Dir use "lib";
   for Object_Dir use "obj";
   for Source_Dirs use ("src");

end Hello;

liblibhello.def (导出的符号,区分大小写,这里必须是小写)

LIBRARY   LIBHELLO
EXPORTS
    initialize
    finalize
    say_hello

号外。用Visual Studio 2019测试DLL

为了测试DLL,我决定使用Visual Studio CE 2019创建一个小型应用程序。我首先使用库管理器创建了一个导入库(lib 工具)。) 从 "x64 Native Tools Command Prompt for VS 2019 "中,我调用了。

> lib /machine:X64 /def:./lib/libhello.def /out:./lib/libhello.lib
Microsoft (R) Library Manager Version 14.26.28806.0
Copyright (C) Microsoft Corporation.  All rights reserved.

   Creating library libhello.lib and object libhello.exp

然后,我创建了一个新的文件夹,并填充了下面的源文件和之前创建的文件。libhello.dll, libhello.alibhello.exp. 我终于编译它(再次,从 "x64 Native Tools Command Prompt for VS 2019"),使用

cl HelloApp.cpp libhello.lib
Microsoft (R) C/C++ Optimizing Compiler Version 19.26.28806 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

HelloApp.cpp
Microsoft (R) Incremental Linker Version 14.26.28806.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:HelloApp.exe
HelloApp.obj
libhello.lib

这个新 HelloApp.exe 显示(如预期)一个对话框。请注意 libhello.dll 取决于GNAT运行时库(请检查 依赖性步行者),所以要确保(在你的情况下) C:\GNAT\2017\bin 的搜索路径上(或将所需的 DLLs 复制到与搜索路径相同的文件夹中)。HelloApp.exe).

Hello.h

#pragma once

extern "C"
{
    extern void  say_hello();
    extern void  initialize();
    extern void  finalize();
}

HelloApp.cpp

#include <windows.h>
#include "hello.h"

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    UNREFERENCED_PARAMETER(hInstance);
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(pCmdLine);
    UNREFERENCED_PARAMETER(nCmdShow);

    initialize();
    say_hello();
    finalize();

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.