aix环境编译so文件
① AIX 下makefile 编译问题
环境变量没有定义好。
echo $cc
看看定义了没。
也就是你的编译器。
② 在AIX中编译了一份Apache并且安装在/usr/src/Apache目录下,本打算将这份安装好的Apache打包发不到其它AIX
可能在编译的时候已经把库的路径个给编进去了,你可以这样试试:
ln -s /home/TAS/httpserver /usr/src/Apache
③ 在AIX平台如何创建动态库
除此之外, 在AIX 平台,系统提供了丰富的工具创建动态库。 从大的范围看有两种不同的方法可以创建动态库,一种是按照传统的方式,编写输出符号 文件,创建动态库。另一种可通过编译器提供的参数选项,自动生成输出符号文件创建动态 库。将逐一给出介绍。 按照传统的方法创建动态库,关键的问题是如何编写输出符号文件,Visual Age C/C++ 这一产品给我们提供了一个比较好的工具CreateExportList 帮助我们完成。参考下面的例子, 将给出详细的步骤说明,如何创建输出符号文件。 测试用例为C 程序文件,文件名为show.c 和trans.c ,源码分别为: /* ** show.c */ #include void show(char *pt){ printf("The showing text : %s/n", pt); } /* ** trans.c */ #include void trans(char *str1) { char str[20]; strcpy(str, str1); show(str); } 上面的两个示例程序中,show.c 包含函数show() ,trans.c 包含函数 trans() ,借助于CreateExportList 工具,首先生成输出符号文件,步骤如下: 1 )编译源程序show.c 和trans.c xlc –c show.c xlc –c trans.c 生成相应的目标文件show.o 和trans.o 2 )创建包含目标文件的纯文本文件 创建此文件的目的是帮助我们收集动态库包含的目标文件,这一步并不是必需的,假设文件名为 objlist ,内容如下: show.o trans.o 3 )创建输出符号文件,文件包含动态库要输出的所有符号,假定文件名为exp.f /usr/vac/bin/CreateExportList exp.f –f objlist 如果没有objlist 文件,也可以将目标文件逐一列示: /usr/vac/bin/CreateExportList exp.f show.o trans.o 查看文件exp.f 内容为: show trans 4 )编辑输出符号文件,在文件起始处增加#! 动态库名行,假定要创建的动态库名为libct.so ,如下: #!libct.so 5 )编辑输出符号文件,删除不希望输出的符号。CreateExportList 创建的输出文件可能包含所有的函数, 无论是调用的还是被调用,需要删除掉不希望输出的符号,或调用的系统函数。 输出符号文件创建完成后,接下来,就可以创建动态库了。前面已经提过,动态库是 由编译器创建的,这一点与静态库的创建有本质的区别,如下: xlc –bE:exp.f –bnoentry -bM:SRE –olibct.so show.o trans.o 本质上,这是有ld 完成的,xlc 只是将参数传递给ld 。这可以节省部分工作,这是因为,相对于xlc ,ld 是 比较最底层的操作,需要对系统提供的库比较熟悉。如果直接使用ld ,必须要清楚,创建库需要的所有资源。 假如我们简单的将以上命令的xlc 替换为ld ,请看以下输出结果: [root@ibmp630#]ld -bE:exp.f -bnoentry -bM:SRE -o libct.so show.o trans.o ld: 0711-317 ERROR: Undefined symbol: .printf ld: 0711-317 ERROR: Undefined symbol: .strcpy ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information 正确的使用命令,如下: ld –bE:exp.f –bnoentry -bM:SRE –olibct.so show.o trans.o –lc 至此,按照传统的方法创建动态库已经完成。可以看到,以上的步骤比较多,且 繁琐,实际上Visual Age C/C++ 同样提供了一种相对简单的方法,只需使用编译参数-G 即可,步骤分析如下: 1 ) 编译源程序 xlc –c show.c xlc –c trans.c 2 ) 创建动态库 xlc –G –olibct.so show.o trans.o 这种方法,简单明了,省掉好多重复的操作。 以上,介绍了动态库的创建方法,可以用下面的例子测试创建的动态库: int main() { show("test show"); trans("test trans"); return 0; } 这是一个很简单的例子,通过函数调用测试一下动态库能否使用 xlc –brtl –o test main.c –lct –L. 运行test 程序,结果如下: [root@ibmp630#]./test The showing text : test show The showing text : test trans 对C++ 的程序,创建动态库的方法与上面一致,区别在于编译器应使用xlC ,符号输出文件使用 /usr/vacpp/bin/CreateExportList 创建。除以上介绍的方法外,也可以使用工具/usr/vacpp/bin/makeC++SharedLib 创建。 总之,动态库的创建是一个比较复杂的过程,也有可能会出现创建完动态库后,不能使用的情况。以上,只 是一个比较通用的方法
④ 如何在AIX系统下编译c或c++源文件,具体说明一下。谢谢各位高手。
如果你有myprogram.cpp文件,那么使用xlC myprogram.cpp 就可以编译了,默认生成输出文件名为a.out,
如果要指定输出文件,可以使用xlC myprogram.cpp -o myprogram,这样就可以生成名字为myprogram的文件
⑤ aix环境下如何编译内嵌sql, 数据库是db2,ec结尾文件
查看环境变量 db2set 如果发现db2set中db2codepage不是819,执行以下是代码片段:db2set db2codepage=819
db2 create database test05 on /home/db2inst1
db2 connect to test05 user db2inst1 using db2 创建对应pagesize大小的缓冲池和表空间以下是代码片段:db2 CREATE Bufferpool USER8 SIZE 1000 PAGESIZE 8K
db2 CREATE Bufferpool USER16 SIZE 1000 PAGESIZE 16 K
db2 CREATE Bufferpool USER32 SIZE 1000 PAGESIZE 32 K
db2stop force ( 可以先用:db2stop 、db2 terminate进行停止)db2startdb2 connect to test05 user db2inst1 using db2
db2 "CREATE REGULAR TABLESPACE TS_USER8 PAGESIZE 8K MANAGED BY SYSTEM USING ('FSMS_8K_1') BUFFERPOOL USER8"
db2 "CREATE REGULAR TABLESPACE TS_USER16 PAGESIZE 16K MANAGED BY SYSTEM USING ('FSMS_16K_1') BUFFERPOOL USER16"
db2 "CREATE REGULAR TABLESPACE TS_USER32 PAGESIZE 32K MANAGED BY SYSTEM USING 创建临时表空间(用于缓冲查询结果或者临时表)以下是代码片段:db2 CREATE Bufferpool TMPBUF8 SIZE 10000 PAGESIZE 8K
db2 "CREATE TEMPORARY TABLESPACE TempTS_USER8 PAGESIZE 8K MANAGED BY 给相关用户付权限以下是代码片段:db2 GRANT DBADM,CREATETAB,BINDADD,CONNECT,LOAD ON DATABASE TO USER EASYMIS
db2 GRANT USE OF TABLESPACE TS_USER8 TO easymis
db2 GRANT USE OF TABLESPACE TS_USER16 TO easymis
db2 GRANT USE OF TABLESPACE TS_USER32 TO easymis 开始创建表、创建(这种方式是直接创建表、视图的方式,如果采用db2move的方式,那么则不需要)以下是代码片段:db2 connect to test05 user easymis using easymis
db2 -f dbstruct.sql >crttab.log
db2 -f view.sql >crtviw.log 恢复db2move备份的数据库(备份的过程参见后面的db2move的说明)以下是代码片段:db2move test05 import -l /home/db2inst1/wk/test04
db2 -tvf view.sql >crtview.log #如果脚本是db2look,命令结束符为分号,行结束无特殊符号
⑥ 新手入门:AIX下如何用命令行编译并执行一个C程序GCC和CC的区别是什么
谢谢! 明天我去试一下。另外,在AIX下我输入:gcc -v 想查看GCC版本号,提示GCC不存在,但是输入:cc -v 则提示IBM XLC的版本信息,不知道这个是什么原因 ?
⑦ 求教:aix下动态链接库*.so文件如何编译出来
先检查你的编译器是什么编译器:
看是gcc还是cc,下面是cc版本的
编译成32位版本:
cc -q32 -qmkshrobj -o XXXXXX.so XXXXXX.c
编译成64位版本:
cc -q64 -qmkshrobj -o XXXXXX.so XXXXXX.c
⑧ 工行提供了一个 aix下面编译的c语言写的so文件,让我在64为linux下调用,
1、ELF(Executable and Linkable Format)文件格式是各种Unix系统中最为常用的格式。
2、可能是你读的格式不正确。
3、可能是文件损坏。
⑨ 如何在aix环境下生成动态链接库
libwrapper.so: $(libwrapper_so_OBJECTS)
@echo ${COMPILE}
@echo $(libwrapper_so_OBJECTS)
${COMPILE} -shared $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
# ${COMPILE} -qmkshrobj $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
在linux下编译没有问题,但是在AIX下编译会报如下错误
xlc -DAIX -c -I/usr/java14/include -I/usr/java14/include/aix wrapperinfo.c
xlc -DAIX -shared wrapperjni_unix.o wrapperinfo.o wrapperjni.o -o ../../lib/libwrapper.so
ld: 0706-012 The -h flag is not recognized.
ld: 0706-012 The -a flag is not recognized.
gmake: *** [libwrapper.so] Error 255
百思不得其解,网上一查,很多类似情况,但都没有解决方法,最后试着将Makefile修改如下
libwrapper.so: $(libwrapper_so_OBJECTS)
@echo ${COMPILE}
@echo $(libwrapper_so_OBJECTS)
# ${COMPILE} -shared $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
${COMPILE} -qmkshrobj $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
编译通过,问题解决。
现在来想,可能是AIX下生成动态库使用的编译器选项为-qmkshrobj,而不是-shared造成的。
至于报-h和-a选项标识错误,估计是连接器不认识-shared选项,故而当作-s,-h,-a,-r,-e,-d选项来对待,
而恰巧支持-s,-r,-e选项,而不支持-h,-a选项,所以出现该错误。
⑩ aix系统编译make
换gmake试一下
gmake是GNU Make的缩写。 Linux系统环境下的make就是GNU Make,之所以有gmake,是因为在别的平台上,make一般被占用,GNU make只好叫gmake了。 比如在安装二进制文件进行编译时要使用make命令,但如果在Solaris或其他非GNU系统中运行,必须使用GNU make,而不是使用系统自带的make版本,这时要用gmake代替make进行编译