电竞比分网-中国电竞赛事及体育赛事平台

分享

(四)靜態(tài)庫和動態(tài)庫的生成和使用(windows(基于vs)和Linux(基于Ubuntu))

 imelee 2017-09-24

Windows系統(tǒng)vs環(huán)境下:

1、靜態(tài)庫:

1)生成:

  a)在vs中將程序編寫完成
  b)依次點擊 視圖->其他窗口->屬性管理器,在彈出的屬性管理器窗口中右鍵“Debug | Win32”條目 -> 屬性,在xxx屬性頁 左側(cè) 依次點擊 通用屬性 -> 常規(guī)
  c)在右側(cè)找到“項目默認(rèn)值”中的第一個“配置類型”,選擇“靜態(tài)庫(.lib)”
  d)依次點擊 生成 -> 生成解決方案(ctrl+shift+b)
  e)然后在 對應(yīng)項目文件中的debug文件夾中即可找到xxx.lib文件
  d)最后一定要編寫相應(yīng)的.h文件

2)使用:(假設(shè)項目A需要使用)

  a)將上訴e步驟中的xxx.lib和xxx.h文件復(fù)制到A項目文件下(和項目A的.c文件在一起)
  b)在A項目中的“解決方案資源管理器”(左側(cè)欄)右鍵點擊頭文件 -> 添加 -> 現(xiàn)有項,選擇剛剛的xxx.h文件
  c)依次點擊 依次點擊 視圖->其他窗口->屬性管理器,在彈出的屬性管理器窗口中右鍵“Debug | Win32”條目 -> 屬性,,在xxx屬性頁 左側(cè) 依次點擊 配置屬性 -> 鏈接器 -> 輸入,在左側(cè)窗口的第一項“附加依賴項”中添加剛剛的xxx.lib文件
  d)在A項目的.c文件中#include “xxx.h”即可使用xxx.h中的函數(shù)了

2、動態(tài)庫:

1)生成

  a)依次點擊 文件 -> 新建 -> 項目
  b)點擊左側(cè) 模板 -> visual c++ -> Win32,在右側(cè)選擇win32控制臺應(yīng)用程序(記得命名)點擊確定,在彈出的對話框中依次點擊 下一步 -> 在應(yīng)用程序類型 選擇 DLL -> 完成
  c)在右側(cè)依次點擊 右鍵源文件 -> 添加 -> 新建項 -> c++文件(一定要是c++文件)(eg:文件名為main.cpp)
  d)在main.cpp文件中首先添加#include “stdafx.h”若要生成的dll是由C語言寫的話就如下操作:

main.cpp文件:

#include "stdafx.h"
extern "C"http://在c++語言中,extern "C"告訴編譯器,用C語言的方式編譯這個函數(shù)
            {
                __declspec(dllexport)//必須添加這句,告訴編譯器這個dll的函數(shù)入口,而且每一個函數(shù)都要加
                  int mymax(int a, int b)
                  {
                    if (a > b)
                        return a;
                    else
                        return b;
                  }

            __declspec(dllexport)//同上
                      int myadd(int a, int b)
                  {
                    return a + b;
                   }
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

并且編輯相應(yīng)的.h文件將其中的函數(shù)聲明包含進去,如果dll是由c++編寫的則參考另外一篇博客

  e)依次點擊 生成 -> 生成解決方案(ctrl+shift+b)
  f)然后在 對應(yīng)項目文件中的debug文件夾中即可找到xxx.lib和相應(yīng)的xxx.dll文件

2)使用:(假設(shè)項目A需要使用)

  a)將上訴f步驟中的xxx.lib和xxx.h文件復(fù)制到A項目文件下(和項目A的.c文件在一起),*并且一定要把上述的xxx.dll文件復(fù)制到A項目的第一個文件下的debug下(即:項目A -> debug若沒有這個文件夾則讓A項目編譯一次,會出錯沒關(guān)系)
  b)在A項目中的“解決方案資源管理器”(左側(cè)欄)右鍵點擊頭文件 -> 添加 -> 現(xiàn)有項,選擇剛剛的xxx.h文件
  c)在A項目的c文件中添加#include “xxx.h”和#pragma comment(lib,”mydll.lib(對應(yīng)的dll文件名)”)即可使用xxx.h中的函數(shù)了


Linux系統(tǒng)中:

1、靜態(tài)庫:

1)生成:

  a)首先直接編寫要生成庫的函數(shù):(放在/home/book/LinuxProgmentTest/mycalc/src中)
add.c文件:int add(int a,int b){return a+b;}
sub.c文件:int sub(int a,int b){return a-b;}
mul.c文件:int mul(int a,int b){return a*b;}
sub.c文件:int div(int a,int b){return a/b;}
  b)編譯靜態(tài)庫可以有兩種方式:
     I)在終端中進入src文件夾,依次輸入:

gcc -c -fPIC *.c
ar rcs libmycal.a *.o

     II)或者編寫makefile如下:

CC=gcc
SRCS=add.c sub.c mul.c div.c
OBJS=$(SRCS:.c=.o)

libmycal.a:$(OBJS)
    ar rcs libmycal.a $(OBJS)              
%.o:%.c
    $(CC) -o $@ -c $< -fPIC
clean:
    rm -rf $(OBJS) *~
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

最后在mycalc文件夾下新建一個lib目錄,將生成的libmycal.a文件拷貝到lib目錄下。
  c)編寫相關(guān)的頭文件(將編譯好的文件放到/home/book/LinuxProgmentTest/mycalc/include中)
commemd.h:

#ifndef COMMON_H_
#define COMMON_H_
int add(int a,int b);
int sub(int a,int b);
int div(int a,int b);
int mul(int a,int b);
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  d)使用nm命令可以查看其中包括的函數(shù)和在何處實現(xiàn)的(eg:nm libmycal.a)
  

2)使用:(以/home/book/LinuxProgmentTest/mycalc為例)

所有的文件編寫好后結(jié)構(gòu)如下:
目錄結(jié)構(gòu)
  a)編寫好main.c文件后,編譯的時候可以有兩種方式:
    I)gcc -Iinclude main.c lib/libmycal.a -o app (因為頭文件在include文件夾中)
    II)或者編寫makefile文件如下:

CC=gcc
SRCS=main.c
OBJS=$(SRCS:.c=.o)
LINK=include
LIB=lib/libmycal.a

main:$(OBJS)
        $(CC) -o main $(OBJS) -I$(LINK) $(LIB)
%.o:%.c
        $(CC) -o $@ -c $< -I$(LINK) 
clean:
        rm -rf $(OBJS) *~
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

**2、動態(tài)庫:

**1)生成:

  a)首先直接編寫要生成庫的函數(shù)eg:

int max(int a,int b)
{  
    if(a>b) 
        return a;
    else
        return b;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(假設(shè)名字為mydll.c)

  b)編譯動態(tài)庫可以有三種方式:
     I)在mydll.c文件夾下依次輸入:

gcc -c mydll.c -fPIC -o mydll.o
gcc -shared -o libmydll.so mydll.o

     II)或者編寫makefile如下:

CC=gcc
SRCS=mylib.c
OBJS=$(SRCS:.c=.o)

libmylib.so:$(OBJS)
    $(CC) -o libmylib.so $(OBJS) -shared     
%.o:%.c
    $(CC) -o $@ -c $< -fPIC
clean:
    rm -rf $(OBJS) *~
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

     *III)在mydll.c文件夾下依次輸入:

gcc -c mydll.c -fPIC -o mydll.o
gcc -shared -W1,-soname,libmydll.so.1 -o libmydll.so.1.10 mydll.o
(就可以生成有版本so文件)

     IIII)但是記住不論用哪一種方式都有這三條:
      1、gcc編譯的時候(有-c參數(shù)時)要加-fPIC選項,-fPIC是告訴gcc生成一個與位置無關(guān)的代碼
      2、gcc鏈接的時候要加-shared選項,意思是生成一個so共享庫
      3、對于linux或者unix,一個so文件,文件擴展名必須是so,文件名的前三個字母必須是lib

  c)編寫相關(guān)的頭文件,將上訴函數(shù)的聲明放入頭文件中eg:

#ifndef MYLIB_H
#define MYLIB_H

int max(int i,int j);

#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

#**2)使用:(假設(shè)項目A需要使用)

  a)把libxxx.so放在和A項目的.c文件目錄下,編譯項目A的時候可以有兩種方式:
    I)方法一:

gcc -c main.c -o main.o
gcc -o main main.o -L. -lxxx
(-L.后面有一個小點,-lxxx小寫的L字母,xxx是libxxx.so中的xxx)

    II)方法二:或者編寫makefile文件如下:

CC=gcc
SRCS=main.c
OBJS=$(SRCS:.c=.o)

main:$(OBJS)
    $(CC) -o main $(OBJS) -L. -lxxx
%.o:%.c
        $(CC) -o $@ -c $<
clean:
    rm -rf $(OBJS) *~
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  b)修改環(huán)境變量:
    ldd指令可以查看該可執(zhí)行程序的鏈接情況(eg:ldd main)
    在命令行依次輸入:cd (后面有一個空格) -> sudo gedit .proflie -> 在最后一行的下一行添加這句話:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 然后保存退出 -> 輸入. .profile(點 空格 點profile)
  c)在項目A文件夾中輸入ldd main可以查看文件main的鏈接情況只有當(dāng)括號中都有東西是才能執(zhí)行
  d)然后就可以運行了
  
注1:
目錄結(jié)構(gòu):
目錄結(jié)構(gòu)

更改環(huán)境變量前:
更改環(huán)境變量前

更改環(huán)境變量前如果運行則會出現(xiàn)錯誤:
出錯

更改環(huán)境變量后,即可找到動態(tài)庫位置:
更改環(huán)境變量后

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多