在 IBM AIX 5.3 上使用 GCC 编译程序心得如下:
1、编译 64 位和 32 位程序的参数分别是 -maix64 -maix32 ,默认编译 32 位程序
2、链接时指定动态库直接给定动态库名称,例如 libfunc.so 而不是 -lfunc 的形式,否则给出 ld returned 255 错误信息
3、搜索动态库的路径 -L 指定的目录将被编译到目标程序中,例如使用 -L. 编译的结果使用 ldd 查看可以看到 ./libfunc.so 如果使用 -L/app/demo 则 ldd 显示依赖与 /app/demo/libfunc.so
如果有文件 func.cpp 和 demo.cpp 前者编译成动态库 libfunc.so ,后者是可执行程序,使用前面的动态库,命令列表如下:
g++ -fPIC -O3 -ggdb -o func.o func.cpp
g++ -fPIC -O3 -ggdb -o main.o demo.cpp
g++ -fPIC -shared -o libfunc.so func.o
g++ -fPIC -o demo demo.o libfunc.so -L.
执行 demo 程序可以看到已经调用动态库中的函数输出信息,使用 ldd 可以看到 demo 依赖动态库 ./libfunc.so
这与在 linux 下编译的参数有差异,在 linux 下编译的命令行应该是:
g++ -fPIC -c -o func.o func.cpp
g++ -fPIC -shared -o libfunc.so func.o
g++ -fPIC -c -o demo.o demo.cpp
g++ -fPIC -o demo demo.o -lfunc -L/app/demo
linux 的动态库加载器严格按照 LD_LIBRARY_PATH 的顺序搜索,不像 Windows 会首先在可执行程序所在的目录搜索。
如果在 LD_LIBRARY_PATH 中配置了当前目录 . 则在 /app/demo 下执行 demo 可以成功执行,但是在 /app 下执行 demo/demo 则提示找不到动态库。