我正在使用一个名为Harbour的开发平台来使用Clipper代码来创建在32位SuSe上运行的Linux可执行文件。
我已经可以创建一个仍然需要平台外部库的可执行文件,但我需要一个独立的可执行文件。Harbour 允许我通过包含所有需要的库来做到这一点,但是当我尝试以下编译命令时:
hbmk test3 -static
我得到以下错误输出:
Harbour 2.0.0 (Rev. -1)
Copyright (c) 1999-2010, http://www.harbour-project.org/
Compiling 'test3.prg'...
Lines 3, Functions/Procedures 1
Generating C source output to 'test3.c'... Done.
/usr/lib/gcc/i586-suse-linux/4.5/../../../crt1.o: In function
`_start':
/usr/src/packages/BUILD/glibc-2.11.2/csu/../sysdeps/i386/elf/start.S:
115: undefined reference to `main'
./test3.o: In function `HB_FUN_MAIN':
test3.c:(.text+0x17): undefined reference to `hb_vmExecute'
./test3.o: In function `hb_vm_SymbolInit_TEST3':
test3.c:(.text+0x4e): undefined reference to `hb_vmProcessSymbols'
./test3.o:(.data+0x38): undefined reference to `HB_FUN_QOUT'
/tmp/cc5KcKMd.o: In function `hb_lnk_SetDefault_build':
hb-build-root-24212.c:(.text+0x1e): undefined reference to
`hb_vmSetDefaultGT'
/tmp/cc5KcKMd.o: In function `_hb_lnk_ForceLink_build':
hb-build-root-24212.c:(.text+0x8): undefined reference to
`HB_FUN_HB_GT_STD'
collect2: ld returned 1 exit status
我此时的代码非常简单且笨拙:
function main()
? "All done."
return nil
(它基本上将"全部完成"输出到屏幕上,这就是我让它做的全部工作,直到我能让它正确编译。
从我试图追踪这个问题的 90 分钟来看,听起来要么它找不到函数"main"(显然存在),要么 c 编译器需要 -g 参数集 - 这是我无法做到的,因为我实际上并没有解决编译器自己 - Harbour 编译器自己做所有事情......
我还想指出,路径
/usr/src/packages/BUILD
我的系统上是空的!但是,顶部错误中提到的完整路径被硬编码到文件 crt1.o...
我什至尝试告诉编译器创建一个 c 对象并编译它,但它没有为 c 编译器生成正确的输入文件,而且我对 clipper 和 c 都相当陌生......
如果我没有正确标记这个问题,我深表歉意 - 这是我的第一篇 stackoverflow 帖子 - 但我在这里看到了很多关于其他主题的知识渊博的答案,所以我决定尝试一下。如果需要更多信息,请告诉我。
提前感谢!
我想出了一个解决方法。
我安装了 Debian 的副本(而不是 OpenSuSe)并重试,这次我不再遇到顶部的错误。
遇到了一些缺少库的问题,并且在编译器不断抱怨缺少它们之后不得不安装 gcc 和各种 zlib 或 libz 库:
/usr/bin/ld: cannot find -l[xyz]
但是我一直在尝试Synaptic包管理器的搜索并安装库,直到它起作用。
最后,又少了一个库:
/usr/bin/ld: cannot find -lz
那个需要一些谷歌工作,但我发现我需要安装的库是 zlib1g-dev,安装后,它正常编译!
下一个障碍是,当在另一台计算机上运行新的可执行文件时,它需要更多的库,所以我告诉我的编译器包含所有静态库 - 它终于工作了!
所以现在我有了我的工作独立便携式可执行文件,希望其他人遇到同样的问题(无论可能性有多大)并在这里寻求帮助。
问题解决了。