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進行編譯