go編譯靜態庫

go編譯靜態庫

例如我有個golang項目ucp, 項目目錄如下

.
├── README.md
├── a.out
├── client.json
├── cmd.sh
├── dist
│   ├── libmudp.a
│   ├── libucp.h
│   ├── mudp.c
│   └── mudp.h
├── main.go
├── server.json
└── tests
    └── ucp_test
        └── main.c

終端命令行進入ucp項目目錄,輸入如下命令

go build -buildmode=c-archive -o dist/libucp.a

在dist目錄得到靜態庫libucp.a和libucp.h

c使用go靜態庫

直接使用

gcc -o a.out tests/ucp_test/main.c dist/libucp.a

間接引用

mudp.c mudp.h引用go庫後, main.c間接引用

    go build -buildmode=c-archive -o dist/libucp.a
    cd dist
    gcc -c mudp.c  -o mudp.o
    ar -crs libmudp.a mudp.o  #歸檔成.a靜態庫
    cd ..
    gcc -o a.out tests/ucp_test/main.c -Ldist -lmudp -lucp

c編譯進一個獨立的靜態庫

編譯可執行程序時只用依賴一個靜態庫

    ar -xs libucp.a      #拆解靜態庫成.o中間文件
    ar -rcs libmudp.a *.o   #歸檔成.a靜態庫
    rm *.o libucp.a '__.SYMDEF SORTED'  #刪除中間文件
    cd ..
    gcc -o a.out tests/ucp_test/main.c -Ldist -lmudp

接下來直接執行就好了

./a.out

參考

靜態庫和動態庫
將代碼及依賴的靜態庫編譯爲新靜態庫
動態庫(.so)鏈接靜態庫(.a)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章