我正在尝试在 z/OS 上编译可执行文件。 最后一步因一些未定义的符号而失败。 据推测,这是因为之前生成 .so 的步骤也生成了零长度 .x 文件。 .so 看起来很正常,在其上执行“nm”会显示已定义的缺失符号。
典型的.o是用
编译的xlclang -c -m64 -fvisibility=default -DOS390 -DZOS -D_EXT=1 -D_ALL_SOURCE -Duserelocatableinc -DMAXSIG=39 -DNSIG=39 -DOEMVS -DYYDYNAMIC -DNO_LOCALE_MESSAGES -D_OPEN_THREADS=3 -D_UNIX03_SOURCE=1 -D_AE_BIMODAL=1 -D_XOPEN_SOURCE_EXTENDED -D_ALL_SOURCE -D_ENHANCED_ASCII_EXT=0xFFFFFFFF -D_OPEN_SYS_FILE_EXT=1 -D_OPEN_SYS_SOCK_IPV6 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED -D_SHR_ENVIRON -DNO_NL_LOCALE_NAME -DDEBUGGING -g -c -m64 util.c
产生零长度 .x 的步骤看起来像
clang -o libperl.so -shared -Wl,-bedit=no -m64 op.o perl.o universal.o av.o builtin.o caretx.o class.o deb.o doio.o doop.o dquote.o dump.o globals.o gv.o hv.o keywords.o locale.o mathoms.o mg.o mro_core.o numeric.o pad.o peep.o perlio.o perly.o pp.o pp_ctl.o pp_hot.o pp_pack.o pp_sort.o pp_sys.o reentr.o regcomp.o regcomp_debug.o regcomp_invlist.o regcomp_study.o regcomp_trie.o regexec.o run.o scope.o sv.o taint.o time64.o toke.o utf8.o util.o os390.o /karlw/zopen/usr/local/zopen/zoslib/zoslib/lib/libzoslib.x DynaLoader.o -lm -lc
任何建议,包括我可以采取的进一步调试步骤,将不胜感激
通常你不想混合使用不同的编译器。您有 xlclang 和 clang,它们是不同的编译器。在这种情况下,它可以工作,但您确实需要确保导出您想要作为侧面板一部分的任何函数或数据。您是否为初始编译指定了类似 -qexportall 选项的内容?
例如,这是一个有效的简单设置。您也可以尝试简单的源代码和编译命令集,然后构建现有的编译命令。
---funcs.c---
int fool1(int val1) {
return val1 * 11;
}
int passCode(void) {
return 5;
}
int checkTheCode(int code) {
return code == 55;
}
int main(void) {
if (checkTheCode(foo11(passCode()))) {
return foo11(passCode());
} else {
return fool1(6);
}
}
xlclang funcs.c -c -m64 -fvisibility=default -qexportall
clang -o funcs.so --shared -Wl,-bedit=no -m64 funcs.o
这应该给你以下信息:
--- funcs.x ---
IMPORT CODE64,'funcs.so','checkTheCode'
IMPORT CODE64,'funcs.so','fool1'
IMPORT CODE64,'funcs.so','passCode'
希望这有帮助
z/OS XL C/C++ 编译器开发