kylix的动态库 + C/C++的动态库 + linux +mysql 调用 + sqlite !
光看这个题目就不是一个人人都能碰到的“机会”。我很“幸运”的赶上了。今天晚了先说一下难点吧。 最关键的在于C++的 linux 动态库是不能被当前的 kylix3 正确调用的--至少这是我的结论,比较痛苦的时编译器和“我的神”都没有告诉你这一点。我是在老是得到“...gxx_person..”不存在的这个错误时发现的,出现这个错误时 google 告诉我要用 g++ 编译,或者用 gcc 时使用 -lstdc++ 选项,总之是要使用标准C++库(后来我才比较肯定它的意思至少在 redhat9 自带的编译器中是“您使用了C++语法,但却试图当作 C 来编译”的意思),这时您换用 C++ 来编译时得到的so文件是正确的....但是它不能被 kylix 的宿主程序正确调用,它会在你启动程序时死QQ。那么怎样写出一个纯C的 linux 动态库呢,我小心地去掉了所的标准C++调用,但是在我启动 kylix 的宿主程序时,这个错误始终阴魂不散的出现,这时有个很特别的现象,不改动任何代码,只要不include mysql的头文件就能正确运行,反之则不行,即使我用ldd命令看到这个so文件始终只使用了两个其他的最基本so。我只好一边骂娘一边告诉经理mysql的代码中可能含有C++代码。
今天我抖擞精神决定用sqlite替换mysql,sqlite的代码可不那么好编译,我甚至用了devc++来生成我的make文件。千辛万苦编译好后,一运行那个kylix程序,两眼一黑....那个阴魂又出现了!!!我简直不敢相信自己的眼睛,因为sqlite的含源码一起编译的,决对不可能包含C++代码!我重复了无数次...最后只好一点点增加/或去掉那些可能出错的代码,终于发现某种类似C++语法会引起这种情况,但它在C下也是可以运行的。最后听 google 说后缀名可能会使编译器采用C++语法,这个我是知道的,不过从来没发现有什么用处--因为我一向喜欢把C++和纯C混用。好了,最后的解决办法出场了,将文件的CPP后缀名更改为C后,并且不加载任何C++库,最后用gcc来编译--我的so终于可以用了!最后想想mysql库可能也可以这样吧......的确如此。