導航:首頁 > 源碼編譯 > 編譯指定動態鏈接庫版本

編譯指定動態鏈接庫版本

發布時間:2023-03-05 16:59:27

⑴ 如何使用lame源代碼在編譯生成linux環境下的動態庫

動態庫的生成
1>首先生成目標文件,但是此時要加編譯器選項-fpic和鏈接器選項-shared,

gcc -fpic -c add.c

gcc -fpic -c sub.c

生成中間文件add.o和sub.o

2>其次生成動態庫

gcc -shared –o libtiger.so add.o sub.o

生成動態庫libtiger.so,libtiger.so就是我們生成的目標動態庫。我們以後使用動態庫和main.c程序生成可執行程序

說明:

以上兩部也可以合成一步搞定:

gcc -fpic -shared add.c sub.c -o libtiger.so

2.使用動態鏈接庫

在編譯程序時,使用動態鏈接庫和靜態庫是一致的,使用」-l庫名」的方式,在生成可執行文件的時候會鏈接庫文件。

1>使用命令

gcc -o main main.c -L ./ -ltiger

2>-L指定動態鏈接庫的路勁,-ldtiger鏈接庫函數tiger。-ltiger是動態庫的調用規則。Linux系統下的動態庫命名方式是lib*.so,而在鏈接時表示位-l*,*是自己命名的庫名。

3>但是程序會提示如下錯誤

error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct

這是因為程序運行時沒有找到動態鏈接庫造成的。程序編譯時鏈接動態庫和運行時使用動態鏈接庫的概念是不同的,在運行時,程序鏈接的動態鏈接庫需要在系統目錄下才行。

4>使用以下方法可以解決此問題

a. 在linux下最方便的解決方案是拷貝libtiger.so到絕對目錄 /lib 下(但是,要是超級用戶才可以,因此要使用sudo哦,親)。就可以生成可執行程序了

b.第二種方法是:將動態鏈接庫的目錄放到程序搜索路徑中,可以將庫的路徑加到環境變數LD_LIBRARY_PATH中實現:

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

⑵ 如何在Windows下編譯sqlite3,生成動態鏈接庫並使用

一. 編譯動態鏈接庫庫文件
下面的是我的編譯過程,或許對你有些幫助:
1). 打開VC新建一個「Win32 Dynamic-Link Library」工程,命名為:sqlite3
2). 在接下來的對話框中選擇"An empty DLL project",點 FINISH->OK
3). 將源碼中所有的 *.c *.h *.def 復制到工程文件夾
4). 在工程的Source File中添加你下載到的SQLite源文件中所有*.c文件,
注意這里不要添加shell.c和tclsqlite.c這兩個文件。
5). 將 SQLite 源文件中的 sqlite3.def 文件添加到在工程的Source File中
6). 在Header File中添加你下載到的SQLite源文件中所有*.h文件,
7). 開始編譯,Build(F7)一下
也許到這里會遇到一個錯誤:
e:\zieckey\sqlite\sqlite3\sqlite3ext.h(22) : fatal error C1083: Cannot open include file: 'sqlite3.h': No such file or directory
經檢查發現,源碼中包含sqlite3.h都是以 #include <sqlite3.h> 方式包含的,
這就是說編譯器在系統默認路徑中搜索,這樣當然搜索不到 sqlite3.h 這個頭文件啦,
這時可以改為 #include "sqlite3.h" ,讓編譯器在工程路徑中搜索,
但是如果還有其他地方也是以 #include <sqlite3.h> 方式包含的,那麼改源碼就顯得有點麻煩,
好了,可以這樣,在菜單欄依次選擇:Tools->Options...->Directeries
在下面的Directeries選項中輸入你的 sqlite3.h 的路徑,這里也就是你的工程目錄.
添加好後,在編譯一下就好了,
最後在工程目錄的 Debug 目錄生成了下面兩個重要文件:
動態鏈接庫文件 sqlite3.dll 和引入庫文件 sqlite3.lib

二. 使用動態鏈接庫
下面來編寫個程序來測試下動態鏈接庫.
在VC下新建一個空的"Win32 Console Application" Win32控制台程序,工程命名為:TestSqliteOnWindows
再新建一個 test.cpp 的C++語言源程序,源代碼如下:
// name: test.cpp
// This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !
// Author : zieckey
// data : 2006/11/28
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
#define _DEBUG_
int main( void )
...{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("zieckey.db", &db); //打開指定的資料庫文件,如果不存在將創建一個同名的資料庫文件
if( rc )
...{
fprintf(stderr, "Can't open database: %s ", sqlite3_errmsg(db));
sqlite3_close(db);
return (1);
}
else printf("You have opened a sqlite3 database named zieckey.db successfully! Congratulations! Have fun ! ^-^ ");

//創建一個表,如果該表存在,則不創建,並給出提示信息,存儲在 zErrMsg 中
char *sql = " CREATE TABLE SensorData(ID INTEGER PRIMARY KEY,SensorID INTEGER,SiteNum INTEGER,Time VARCHAR(12),SensorParameter REAL);" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
#ifdef _DEBUG_
printf("zErrMsg = %s ", zErrMsg);
#endif
//插入數據
sql = "INSERT INTO "SensorData" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO "SensorData" VALUES(NULL , 23 , 45 , '200605011306', 16.4 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO "SensorData" VALUES(NULL , 34 , 45 , '200605011306', 15.4 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );

int nrow = 0, ncolumn = 0;
char **azResult; //二維數組存放結果
//查詢數據
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
int i = 0 ;
printf( "row:%d column=%d " , nrow , ncolumn );
printf( " The result of querying is : " );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s ", i , azResult[i] );
//刪除數據
sql = "DELETE FROM SensorData WHERE SensorID = 1 ;" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
#ifdef _DEBUG_
printf("zErrMsg = %s ", zErrMsg);
#endif
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
printf( " row:%d column=%d " , nrow , ncolumn );
printf( " After deleting , the result of querying is : " );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s ", i , azResult[i] );

//釋放掉 azResult 的內存空間
sqlite3_free_table( azResult );
#ifdef _DEBUG_
printf("zErrMsg = %s ", zErrMsg);
#endif
sqlite3_close(db); //關閉資料庫
return 0;
}

另外,將sqlite3.h sqlite3.lib sqlite3.dll文件復制到工程目錄.
最後 Project->Settings 在Link選項卡找到Object/library moles : 在最後填入sqlite3.lib 。
如果原來就有鏈接,請使用空格分隔。
現在可以編譯了.
運行結果如下:
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun ! ^-^
zErrMsg = (null)
row:3 column=5
The result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 1
azResult[7] = 1
azResult[8] = 200605011206
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 23
azResult[12] = 45
azResult[13] = 200605011306
azResult[14] = 16.4
azResult[15] = 3
azResult[16] = 34
azResult[17] = 45
azResult[18] = 200605011306
azResult[19] = 15.4
zErrMsg = (null)

row:2 column=5
After deleting , the result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 2
azResult[6] = 23
azResult[7] = 45
azResult[8] = 200605011306
azResult[9] = 16.4
azResult[10] = 3
azResult[11] = 34
azResult[12] = 45
azResult[13] = 200605011306
azResult[14] = 15.4
zErrMsg = (null)
Press any key to continue
這個程序,我們先創建一個資料庫,然後新建一個表,然後插入一些數據,
再查詢看看插入的數據是否正確,然後又刪除一些數據,刪除後我們再查詢了一下,
發現我們的刪除操作也是成功的.
這個程序簡單的調用 sqlite 的函數介面來實現對資料庫的管理,
包括創建資料庫、創建表格、插入數據、查詢數據、刪除數據等。
註:在上面的第五步
5). 將 SQLite 源文件中的 sqlite3.def 文件添加到在工程的Source File中
是必須的, sqlite3.def 這個文件的加入會生成 *.lib引入庫文件,這個對於*.dll文件是很重要的.否則你光有*.dll文件在程序調用的時候就不是那麼方便了,因為這樣你只能通過動態載入dll的方式調用dll庫中函數

三、如何編譯sqlite3.4.2版本 (本人原創:添加於 2007年9月29日)
其實這個版本的比之前的更好編譯而且很簡單。
步驟如下:
1、在網站下載源文件,選擇「sqlite-amalgamation-3_4_2.zip」。此文件中包含了sqlite3.h和sqlite3.c兩個文件。
2、下載「sqlitedll-3_4_2.zip」,次文件中包含編譯好的DLL文件和DEF文件,DEF文件用來在編譯時生成lib文件。(重點)
3、打開VC新建一個「Win32 Dynamic-Link Library」工程,命名為:sqlite3
4、 在接下來的對話框中選擇"An empty DLL project",點 FINISH->OK
5、將解壓後的 *.c *.h *.def 復制到工程文件夾下
6、在工程的Source File中添加你下載到的SQLite源文件中sqlite3.c文件,
7、 將 SQLite 源文件中的 sqlite3.def 文件添加到在工程的Source File中
8、在Header File中添加你下載到的SQLite源文件中的sqlite3.h文件,
9、 開始編譯,Build(F7)一下。

⑶ LLINUX GCC 編譯C使用自定義動態鏈接庫.so的問題

1. 可以參考如下關於庫文件的文章:http://numanal.com/?p=129
2. 在編譯文件時最好用-L指明自定義庫的存在目錄, 利用如下任一語句(.so文件與.c文件在同一目錄):
gcc test.c -o test2 -L./verify.so
gcc test.c -o test2 -L.
3. 你這里在的問題應該與編譯器的某些兼容性有關, 在實際編寫程序的時候最好按gcc的語法規范走, 避免不必要的錯誤.

⑷ 編譯時為什麼要指定鏈接庫

因為有些運行時代碼,是預先存在「鏈接庫」里的。沒有這些庫,程序無法運行。所以編譯時需要指定。

「鏈接庫」分動態和靜態兩種。靜態的庫,編譯時就把相應的代碼「嵌入」可執行文件中。這種可執行文件可以單獨運行,基本不需要「運行時間庫」支持。

而對於動態的庫,編譯時只獲取必要的介面信息,而在運行時根據介面信息,找到對應的動態鏈接庫,並裝入內存。這種可執行文件的大小會小一些。但是需要「運行時間庫」才能正常運行。

有問題繼續交流,謝謝。

⑸ 如何在 Linux 下調試動態鏈接庫

大家都知道在 Linux 可以用 gdb 來調試應用程序,當然前提是用 gcc 編譯程序時要加上
-g 參數。
我這篇文章里將討論一下用 gdb 來調試動態鏈接庫的問題。

首先,假設我們准備這樣的一個動態鏈接庫:
QUOTE:
庫名稱是: ggg
動態鏈接庫文件名是: libggg.so
頭文件是: get.h
提供這樣兩個函數調用介面:
int get ();
int set (int a);
要生成這樣一個動態鏈接庫,我們首先編寫這樣一個頭文件:
[Copy to clipboard]
CODE:
/************關於本文檔********************************************
*filename: get.h
*purpose: 一個動態鏈接庫頭文件示例
*tided by: zhoulifa() 周立發 ()
Linux 愛好者 Linux 知識傳播者 SOHO 族 開發者 最擅長 C 語言
*date time: 2006-11-15 21:11:54
*Note: 任何人可以任意復制代碼並運用這些文檔,當然包括你的商業用途
* 但請遵循 GPL
*Hope:希望越來越多的人貢獻自己的力量,為科學技術發展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*感謝 提供原始代碼,
我在他的基礎上整理了此文
*********************************************************************/
int get ();
int set (int a);
然後准備這樣一個生成動態鏈接庫的源文件:
[Copy to clipboard]
CODE:
/************關於本文檔********************************************
*filename: get.cpp
*purpose: 一個動態鏈接庫源文件示例
*tided by: zhoulifa() 周立發 ()
Linux 愛好者 Linux 知識傳播者 SOHO 族 開發者 最擅長 C 語言
*date time:2006-11-15 21:11:54
*Note: 任何人可以任意復制代碼並運用這些文檔,當然包括你的商業用途
* 但請遵循 GPL
*Hope:希望越來越多的人貢獻自己的力量,為科學技術發展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*感謝 提供原始代碼,
我在他的基礎上整理了此文
*********************************************************************/
#include <stdio.h>
#include "get.h"

static int x=0;
int get ()
{
printf ("get x=%d\n", x);
return x;
}
int set (int a)
{
printf ("set a=%d\n", a);
x = a;
return x;
}
然後我們用 GNU 的 C/C++ 編譯器來生成動態鏈接庫,編譯命令如下:
QUOTE:
g++ get.cpp -shared -g -DDEBUG -o
libggg.so

這樣我們就准備好了動態鏈接庫了,下面我們編寫一個應用程序來調用此動態鏈接庫,源代碼如下:
[Copy to clipboard]
CODE:
/************關於本文檔********************************************
*filename: pk.cpp
*purpose: 一個調用動態鏈接庫的示例
*tided by: zhoulifa() 周立發 ()
Linux 愛好者 Linux 知識傳播者 SOHO 族 開發者 最擅長 C 語言
*date time:2006-11-15 21:11:54
*Note: 任何人可以任意復制代碼並運用這些文檔,當然包括你的商業用途
* 但請遵循 GPL
*Hope:希望越來越多的人貢獻自己的力量,為科學技術發展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*感謝 提供原始代碼,
我在他的基礎上整理了此文
*********************************************************************/
#include <stdio.h>
#include "get.h"
int main (int argc, char** argv)
{
int a = 100;
int b = get ();
int c = set (a);
int d = get ();

printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
return 0;
}
編譯此程序用下列命令,如果已經把上面生成的 libggg.so 放到了庫文件搜索路徑指定的文件目錄,比如 /lib 或 /usr/lib 之類的,就用下面這條命令:
QUOTE:
g++ pk.cpp -o app -Wall -g -lggg
否則就用下面這條命令:
QUOTE:
g++ pk.cpp -o app -Wall -g -lggg -L`pwd`
下面我們就開始調試上面命令生成的 app 程序吧。如果已經把上面生成的 libggg.so 放到了庫文件搜索路徑指定的文件目錄,比如 /lib或 /usr/lib 之類的,調試就順利完成,如下

QUOTE:
./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation,Inc.
GDB is free software, covered by the GNU
General Public License, and you are
welcome to change it and/or distribute
copies of it under certain conditions.
Type "show ing" to see theconditions.

There is absolutely no warranty for GDB.
Type "show warranty" for details.This GDB was configured as "i486-linux-
gnu"...Using host libthread_db library"/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main /* 這是在程序的 main 處設置斷點 */
Breakpoint 1 at 0x804853c: file pk.cpp,line 7.
(gdb) b set /* 這是在程序的 set 處設置斷點 */
Function "set" not defined.
Make breakpoint pending on future shared
library load? (y or [n]) y /* 這里必須選擇 y 調試程序才會跟蹤到動態鏈接庫內部去
*/Breakpoint 2 (set) pending.
(gdb) run /* 開始運行我們的程序,直到遇見斷點時暫停 */
Starting program: /data/example/c/app
Breakpoint 3 at 0xb7f665f8: file get.cpp,line 11.
Pending breakpoint "set" resolved
Breakpoint 1, main (argc=1,argv=0xbf990504) at pk.cpp:7
7 int a = 100;
(gdb) n /* 繼續執行程序的下一行代碼
*/
8 int b = get ();
(gdb) n /* 程序執行到了我們斷點所在的動態鏈接庫了 */
get x=0
9 int c = set (a);(gdb) n
Breakpoint 3, set (a=100) at get.cpp:11
11 printf ("set a=%d\n", a);
(gdb) list /* 查看當前代碼行周圍的代碼,證明我們已經跟蹤到動態鏈接庫的源代碼裡面了 */
6 printf ("get x=%d\n", x);
7 return x;
8 }
9 int set (int a)
10 {
11 printf ("set a=%d\n", a);
12 x = a;
13 return x;
14 }
(gdb) n
set a=100
12 x = a;(gdb) n
13 return x;(gdb) n
14 }
(gdb) n
main (argc=1, argv=0xbf990504) at
pk.cpp:10
10 int d = get ();
(gdb) n
get x=100
11 printf ("a=%d,b=%d,c=%
d,d=%d\n",a,b,c,d);
(gdb) n
a=100,b=0,c=100,d=100
12 return 0;
(gdb) c
Continuing.
Program exited normally.
(gdb) quit /* 程序順利執行結束 */#
如果我們沒有把動態鏈接庫放到指定目錄,比如/lib裡面,調試就會失敗,過程如下:
QUOTE:
# gdb ./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation,
Inc.
GDB is free software, covered by the GNU
General Public License, and you arewelcome to change it and/or distribute
copies of it under certain conditions.

Type "show ing" to see theconditions.
There is absolutely no warranty for GDB.
Type "show warranty" for details.
This GDB was configured as "i486-linux-
gnu"...Using host libthread_db library
"/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main
Breakpoint 1 at 0x804853c: file pk.cpp,
line 7.
(gdb) b set
Function "set" not defined.
Make breakpoint pending on future shared
library load? (y or [n]) y
Breakpoint 2 (set) pending.
(gdb) run /* 雖然調試操作都一樣,但程序執行失敗 */
Starting program: /data/example/c/app
/data/example/c/app: error while loading
shared libraries: libggg.so: cannot open
shared object file: No such file or
directory
Program exited with code 0177.
(gdb) quit
#
本次實驗的環境是:
CPU:AMD Athlon(tm) 64 Processor 3000+
內存:512M
OS:Ubuntu GNU/Linux 6.06 dapper LTS
gcc:gcc 版本 4.0.3 (Ubuntu 4.0.3-1ubuntu5)

break(b) 行號:在某一行設置斷點
break 函數名:在某個函數開頭設置斷點
break...if...:設置條件斷點
continue(或c):從當前位置開始連續而非單步執行程序
delete breakpoints:刪除所有斷點
delete breakpoints n:刪除序號為n的斷點
disable breakpoints:禁用斷點
enable breakpoints:啟用斷點
info(或i) breakpoints:參看當前設置了哪些斷點
run(或r):從開始連續而非單步執行程序
display 變數名:跟蹤查看一個變數,每次停下來都顯示它的值
undisplay:取消對先前設置的那些變數的跟蹤

⑹ 如何查看linux動態鏈接庫文件的版本等其他信息

ldd <可執行文件名> 查看可執行文件鏈接了哪些
系統動態鏈接庫
nm <可執行文件名>
查看可執行文件裡面有哪些符號
strip <可執行文件名>
去除符號表可以給可執行文件瘦身
如果我們想從可執行程序裡面提取出來一點什麼文本信息的話,還可以用strings命令
strings
<可執行文件名>

Linux操作系統上面的動態共享庫大致分為三類:

1、操作系統級別的共享庫和基礎的系統工具庫

比方說libc.so, libz.so,
libpthread.so等等,這些系統庫會被放在/lib和/usr/lib目錄下面,如果是64位操作系統,還會有/lib64和/usr
/lib64目錄。如果操作系統帶有圖形界面,那麼還會有/usr/X11R6/lib目錄,如果是64位操作系統,還有/usr/X11R6
/lib64目錄。此外還可能有其他特定Linux版本的系統庫目錄。

這些系統庫文件的完整和版本的正確,確保了Linux上面各種程序能夠正常的運行。

2、應用程序級別的系統共享庫

並非操作系統自帶,但是可能被很多應用程序所共享的庫,一般會被放在/usr/local/lib和/usr/local/lib64這兩個目錄下面。很多你自行編譯安裝的程序都會在編譯的時候自動把/usr/local/lib加入gcc的-L參數,而在運行的時候自動到/usr/local
/lib下面去尋找共享庫。

以上兩類的動態共享庫,應用程序會自動尋找到他們,並不需要你額外的設置和擔心。這是為什麼呢?因為以上這些目錄默認就被加入到動態鏈接程序的搜索路徑裡面了。Linux的系統共享庫搜索路徑定義在/etc/ld.so.conf這個配置文件裡面。這個文件的內容格式大致如下:

/usr/X11R6/lib64
/usr/X11R6/lib
/usr/local/lib
/lib64
/lib
/usr/lib64
/usr/lib
/usr/local/lib64
/usr/local/ImageMagick/lib

假設我們自己編譯安裝的ImageMagick圖形庫在/usr/local/ImageMagick目錄下面,並且希望其他應用程序都可以使用
ImageMagick的動態共享庫,那麼我們只需要把/usr/local/ImageMagick/lib目錄加入/etc/ld.so.conf文件裡面,然後執行:ldconfig
命令即可。

ldcofig將搜索以上所有的目錄,為共享庫建立一個緩存文件/etc/ld.so.cache。為了確認ldconfig已經搜索到ImageMagick的庫,我們可以用上面介紹的strings命令從ld.so.cache裡面抽取文本信息來檢查一下:

strings
/etc/ld.so.cache | grep ImageMagick

輸出結果為:

/usr/local/ImageMagick/lib/libWand.so.10
/usr/local/ImageMagick/lib/libWand.so
/usr/local/ImageMagick/lib/libMagick.so.10
/usr/local/ImageMagick/lib/libMagick.so
/usr/local/ImageMagick/lib/libMagick++.so.10
/usr/local/ImageMagick/lib/libMagick++.so
已經成功了!

3、應用程序獨享的動態共享庫

有很多共享庫只被特定的應用程序使用,那麼就沒有必要加入系統庫路徑,以免應用程序的共享庫之間發生版本沖突。因此Linux還可以通過設置環境變數LD_LIBRARY_PATH來臨時指定應用程序的共享庫搜索路徑,就像我們上面舉的那個例子一樣,我們可以在應用程序的啟動腳本裡面預先設置
LD_LIBRARY_PATH,指定本應用程序附加的共享庫搜索路徑,從而讓應用程序找到它。

⑺ 求教:aix下動態鏈接庫*.so文件如何編譯出來

先檢查你的編譯器是什麼編譯器:
看是gcc還是cc,下面是cc版本的
編譯成32位版本:
cc -q32 -qmkshrobj -o XXXXXX.so XXXXXX.c
編譯成64位版本:
cc -q64 -qmkshrobj -o XXXXXX.so XXXXXX.c

⑻ 如何編譯 opencv動態鏈接庫

在一個項目中需要用到OpenCV,剛開始使用了OpenCV的動態鏈接庫,這樣,在移動可執行程序時還必須將OpenCV動態支持庫一起搬移,很是麻煩。所以,最終選擇OpenCV靜態鏈接庫,這樣程序移植運行就方便了很多。

需要編譯成靜態庫以便於應用程序鏈接。

網上有的教程中寫的在VC++2010下安裝OpenCV2.1時用到了TBB庫,而我在編譯鏈接自己的程序後需要用到TBB.dll。本人設計的目的就是要做一個獨立的界面程序,不需要攜帶其他第三方庫。經過一段時間的努力最終找到了編譯OpenCV2.1靜態庫的方法。

需要的工具環境及文件:

-------------------------------------------------------------------------------------------------------------

1、Windows XP

2、VC++2010(VS2010)

3、為編譯OpenCV源碼包(我下載的有:OpenCV2.1.0,OpenCV2.3.0及OpenCV2.4.4)

4、CMake2.8.9

說明:OpenCV各版本官方下載地址:opencv.org/

cmake-2.8.9下載地址:ishare.iask.sina.com.cn/download/explain.php?fileid=35025936

--------------------------------------------------------------------------------------------------------------

以OpenCV2.1.0編譯靜態庫為例

CMake配置

-------------------------------------------------------------------------------------------------------------

打開CMake並設置:

Where is the rource code :OpenCV源代碼所在的文件夾

Where to build the binaries:CMake配置好得到的文件放在位置(我的:E:\OpenCV2.1.0-prj)

然後點擊configure,選擇"Visual Studio 10"。然後確定。

等待configure完成,會出現很多紅色的選項,因為主要是生成OpenCV的庫,所以只需保留某些選項:

去掉BUILD_NEW_PYTHON_SUPPORT,BUILD_SHARED_LIBS, BUILD_TESTS

勾選OPENCV_BUILD_3RDPARTY_LIBS, WITH_TBB,WITH_JASPER, WITH_JPEG,
WITH_PNG, WITH_TIFF選項,

然後再點擊configure,如下圖:

提示TBB_INCLUDE_DIR找不到,因為我們不需要TBB庫,所以忽略,再一次點擊configure。

等待配置完成,最後點擊generate,完成後關閉CMake。

-------------------------------------------------------------------------------------------------------------

VC++2010編譯靜態庫

-------------------------------------------------------------------------------------------------------------
進入E:\OpenCV2.1.0-prj目錄,使用VC++2010打開.sln文件,打開項目管理器

這時候會看到

解決方案中有很多小項目存在。

註:這時我們右鍵任意點擊一個子項目(如cv),選擇屬性,可以在配置屬性下的常規項目中看到,配置類型為
靜態庫(lib)。

按住ctrl鍵,選中除過ALL_BUILD, INSTALL, ZERO_CHECK,
uninstall四個項目的其他所有項目,在菜單中選擇項目->屬性,打開配置屬性->c/c++->代碼生成選項,在右側窗口中的運行時庫中選擇多線程調試(/MTd),然後確認。

說明:這里有四個選項(/MT, /MTd, /MD,
/MDd),前兩個一組,為靜態鏈接運行時庫,運行時不需要運行時庫的支持,代碼直接插入到程序中去;後兩個一組,為動態鏈接運行時庫,運行時需要msvcr90.dll或msvcp90.dll支持。

我們先編譯Debug版的OpenCV靜態庫,在解決方案"opencv"(22個項目)上單擊右鍵,選擇重新生成解決方案,此時便開始編譯OpenCV庫了,等編譯結束會提示完成16個,失敗4個:

這四個項目生成的是exe程序,不需要管他們。到這步我們已經生成了Debug版本的靜態庫!

然後我們用相同的方式生成Release版的庫,在之前的基礎上只需要將選項選擇多線程/MT,再進行編譯。編譯時警告很多,直接忽略!

注意:/MT即是Release版本,/MTD即是Debug版本。

最終我們需要的靜態庫就存在:E:\OpenCV2.1.0-prj/lib 和 E:\OpenCV2.1.0-prj/3rdparty/lib
兩個目錄,我們編譯好的庫就在這兩個文件夾下。分別

將E:\OpenCV2.1.0-prj/3rdparty/lib中Debug
下面的所有文件Copy到E:\OpenCV2.1.0-prj/lib中的Debug 文件中。

將E:\OpenCV2.1.0-prj/3rdparty/lib中Release下面的所有文件Copy到E:\OpenCV2.1.0-prj/lib中的Release文件中。

⑼ 動態鏈接庫怎樣條件編譯

project setting 中進行編譯參數設置, 自己可以試試,

閱讀全文

與編譯指定動態鏈接庫版本相關的資料

熱點內容
android應用logo 瀏覽:898
光遇安卓服墓土商店什麼時候開 瀏覽:566
月收益翻倍的源碼 瀏覽:636
asop源碼放在哪裡 瀏覽:987
電腦伺服器密碼怎麼找 瀏覽:574
jdp轉換pdf 瀏覽:748
把pdf導入iphone 瀏覽:508
米哈游租賃的雲伺服器是哪個 瀏覽:524
android直接打電話 瀏覽:1016
ubuntu停止命令 瀏覽:283
cnc攻絲編程 瀏覽:869
換個手機號碼app怎麼注冊 瀏覽:320
怎麼下載小猴口算app 瀏覽:115
輕鏈app的貨怎麼樣 瀏覽:625
電腦里的u盤如何加密 瀏覽:370
我的世界全部版本伺服器下載地址 瀏覽:50
交換原理pdf 瀏覽:228
菜鳥驛站app怎麼邀請新人 瀏覽:448
電腦里總是有一些1k的文件夾 瀏覽:45
drm加密絕對安全 瀏覽:513