乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      (四)靜態(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è)找到“項目默認值”中的第一個“配置類型”,選擇“靜態(tài)庫(.lib)”
        d)依次點擊 生成 -> 生成解決方案(ctrl+shift+b)
        e)然后在 對應項目文件中的debug文件夾中即可找到xxx.lib文件
        d)最后一定要編寫相應的.h文件

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

        a)將上訴e步驟中的xxx.lib和xxx.h文件復制到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控制臺應用程序(記得命名)點擊確定,在彈出的對話框中依次點擊 下一步 -> 在應用程序類型 選擇 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

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

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

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

        a)將上訴f步驟中的xxx.lib和xxx.h文件復制到A項目文件下(和項目A的.c文件在一起),*并且一定要把上述的xxx.dll文件復制到A項目的第一個文件下的debug下(即:項目A -> debug若沒有這個文件夾則讓A項目編譯一次,會出錯沒關系)
        b)在A項目中的“解決方案資源管理器”(左側(cè)欄)右鍵點擊頭文件 -> 添加 -> 現(xiàn)有項,選擇剛剛的xxx.h文件
        c)在A項目的c文件中添加#include “xxx.h”和#pragma comment(lib,”mydll.lib(對應的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)編寫相關的頭文件(將編譯好的文件放到/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

      (假設名字為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生成一個與位置無關的代碼
            2、gcc鏈接的時候要加-shared選項,意思是生成一個so共享庫
            3、對于linux或者unix,一個so文件,文件擴展名必須是so,文件名的前三個字母必須是lib

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

      #ifndef MYLIB_H
      #define MYLIB_H
      
      int max(int i,int j);
      
      #endif
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      #**2)使用:(假設項目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的鏈接情況只有當括號中都有東西是才能執(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)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多