我使用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/