執行的DLL構建的初始化代碼蚊蚋導入時不自動運行。我這樣做,包括在MCVE:的DllMain/DllMainCRTStartup不DLL
division.ads
with System;
with Interfaces.C;
package Division is
--Neither of these work
procedure DllMainCRTStartup ;
pragma Export (StdCall, DllMainCRTStartup , "DllMainCRTStartup"); --Edited as noticed by Brian
-- procedure DllMain
-- pragma Export (StdCall, DllMain , "DllMain ");
function Div (A : in INTEGER; B : in INTEGER) return INTEGER;
pragma Export (C, Div, "MyDivision");
-- --If I put this, it does not compile... maybe a wrong linkage option set?
-- procedure AdaInit;
-- pragma Import (C, AdaInit, "adainit");
end Division;
division.adb
with text_io;
package body Division is
procedure DllMainCRTStartup is begin --DllMain or DllMainCRTStartup
text_io.put("INIT CODE YEAH!!!*************!"); --This does not execute :(
--AdaInit;
end DllMainCRTStartup ;
function Div(A : in INTEGER; B : in INTEGER) return INTEGER is
X : INTEGER := A/B;
begin
return X;
end Div;
end Division;
和GPR:
library project Proj_Name is
for Library_Name use "math";
for Object_Dir use "obj";
for Source_Dirs use ("src");
for Library_Dir use "lib";
for Library_Interface use ("Division");
for Library_Kind use "dynamic";
for Library_Options use ("-LC:\GNAT\2015\lib\gcc\i686-pc-mingw32\4.9.3\adalib",
"-LC:\GNAT\2015\lib\gcc\i686-pc-mingw32\4.9.3\adalib\libgnat");
end Proj_Name;
我正在用python測試dll,用ctypes。我用ctypes.CDLL導入它,我可以使用MyDivision。但是,導入dll時init代碼不運行,因爲text_io未執行。
在另一方面,如果我的AdaInit程序添加到代碼編譯時,我得到這樣的:
undefined reference to `adainit'
非常感謝您!
「adainit」不是你寫或提供。在任何Ada代碼(例如「crt0.c」)運行之前(通常不可見),在main()在C程序中調用之前,框架通常會運行該命令來初始化Ada RTS。但是,這並不能解釋爲什麼你的DLL啓動沒有被調用。奇怪的是:爲什麼導出的名稱中有一個空格? –
Ups ...錯字。但是,我改變了它,但它沒有工作:( – gccinac