我使用OpenVMS V8.4作为Oracle 10g数据库服务器,它内置了CXX编译器以及由Oracle提供的PROC编译器。
我已经编写了这个示例C程序:
样品c

#include<stdio.h>
exec sql include sqlca;  // adds Oracle PLSQL library
                         // same as #include<sqlca.h>

main() {
    printf("Hello, World!\n");
}

然后我编译了它
DEVSERVER> PROC SAMPLE.C SAMPLE.PC

命令可以运行find,然后我可以使用内置的编译器:
DEVSERVER> CXX SAMPLE.PC

该命令可以正常工作,现在我可以使用内置的CXX命令:
DEVSERVER> LINK SAMPLE

现在我可以通过以下方式运行文件:
DEVSERVER> RUN SAMPLE

我得到了预期的结果:
你好,世界!
所以,没关系。但是我的程序还没有做任何有用的事情。所以,让我们先连接到数据库模式。
我将LINK修改为:
#include<stdio.h>
exec sql include sqlca;

main() {
    printf("Hello, World!\n");

    exec sql connect scott identified by tiger;
    // I skipped checking for sqlca.error since LINKer wont even allow
    //  me to create EXE of this file
}

现在,我像以前一样预编译:
DEVSERVER> PROC SAMPLE.C SAMPLE2.PC
DEVSERVER> CXX SAMPLE2.PC
DEVSERVER> LINK SAMPLE2

这里是我得到这个错误的地方:
%ILINK-W-NUDFSYMS, 1 undefined symbol:
%ILINK-I-UDFSYM,  CX3$Z6SQLCXTPPVPJP6SQLXD384K7FP
%ILINK-W-USEUNDEF, undefined symbol CX3$Z6SQLCXTPPVPJP6SQLXD384K7FP refernced
        source code name: "sqlcxt(void **, unsigned int *, sqlexd *, const sqlcxp *)"
        section: .text
        offset: %X0000000000000350 slot: 2
        module: SAMPLE2
        file: DEV$SERVER[SOURCE]SAMPLE2.OBJ;1

每当我试图在代码中的SAMPLE.C块中执行任何SQL语句时,都会发生同样的错误。
我做错什么了?

最佳答案

您正遇到问题的连锁反应:编译(c++名称损坏)和链接:
https://docs.oracle.com/cd/E11882_01/server.112/e56697/ch6.htm#VMSAR516
注意CODE=CPP参数。这个疏忽很可能是你的第一大头痛。
看起来你是C++名字的受害者。很可能你的编译器正在翻译

 sqlcxt(void **, unsigned int *, sqlexd *, const sqlcxp *)

进入之内
 CX3$Z6SQLCXTPPVPJP6SQLXD384K7FP

然后注意文档中链接到Oracle库的命令过程。

关于c - 无法链接预编译的文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50273639/

10-11 22:59
查看更多