我目前在这支4人小队中遇到问题。
使用我在kiska网站上下载的二进制文件。我能够将cobol编译为C并与之一起运行cobcrun
或编译为可执行文件。但是我无法通过opencobol找到postgres命令。
这是我的cobol脚本的内容:
identification division.
program-id. pgcob.
data division.
working-storage section.
01 pgconn usage pointer.
01 pgres usage pointer.
01 resptr usage pointer.
01 resstr pic x(80) based.
01 result usage binary-long.
01 answer pic x(80).
procedure division.
display "Before connect:" pgconn end-display
call "PQconnectdb" using
by reference "dbname = postgres" & x"00"
by reference "host = 10.37.180.146" & "00"
returning pgconn
end-call
...
通话PQconnectdb
失败module ont found : PQconnectdb
我注意到,如果我重命名libpq.dll,则错误消息将更改为can't find entry point
。因此,至少我确定它可以获取我的dll。
深入研究该libcob
库的调用方法的代码之后。我发现可以使用环境变量COB_PRE_LOAD预先加载一些dll,但无法获得结果。
这是编译cobol的脚本的外观:
call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat"
set COB_CONFIG_DIR=C:\OpenCobol\config
set COB_COPY_DIR=C:\OpenCobol\Copy
set COB_LIBS=%COB_LIBS% c:\OpenCobol\libpq.lib
set COB_LIBRARY_PATH=C:\OpenCobol\bin
set COB_PRE_LOAD=C:\OpenCobol\libpq.dll
@echo on
cobc -info
cobc -free -o pgcob -L:"C:\OpenCobol" -llibpq.lib test_cobol\postgres.cob
call cobcrun pgcob
我没有发现任何遗漏,我使用的是kiska网站上的64位二进制文件,并使用了Visual Studio中的64位cl.exe,Postgres也是64位版本(已通过dependencyChecker检查)。
我什至尝试从Visual Studio编译生成的C,结果也一样,但是我可能会错过一些东西,因为我在C中非常烂,从不需要真正地管理DLL或使用Visual Studio。
我想念什么?
COB_PRE_LOAD不采用任何路径或扩展名,有关可用的运行时配置,请参见简短文档。我猜
set COB_LIBRARY_PATH=C:\OpenCobol\bin;C:\OpenCobol
set COB_PRE_LOAD=libpq
将工作。如果未在其中放置任何其他可执行文件,则可以省略C:\ OpenCobol \ bin。
如果它不起作用(即使它起作用),我将尝试在编译时解决C函数。无论使用
CALL STATIC "PQconnectdb" using ...
或适当CALL-CONVENTION
的程序,或按原样使用该程序
cobc -free -o pgcob -L"C:\OpenCobol" -llibpq -K PQconnectdb test_cobol\postgres.cob
来自cobc --help:
-K generate CALL to <entry> as static
总的来说:kiska.net的二进制文件已经过时了。我强烈建议您从官方下载站点获得更新版本,或者理想情况下从源代码上自行构建它们,请参阅有关使用VisualStudio构建GnuCOBOL的文档。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句