❶ 關於linux下連接動態庫問題
gcc編譯時,當使用動態庫編譯可以按照幾種寫法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的編譯參數都是按照2或3去寫
2寫法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫,即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進行鏈接,當然如果沒有動態庫就會去找靜態庫,再沒有應該就會在編譯時報錯
3寫法的含義是從-L參數首先從指定的目錄中尋找需要鏈接的庫文件,隨後再去尋找系統文件夾中是否存在需要的庫
1寫法的含義是將當前目錄下的./libSDL2-2.so.0文件鏈接進最終文件,因此執行readelf -a a.out後在動態庫部分所看到的路徑就是./libSDL2-2.so.0,進而在執行文件時僅會從當前目錄下尋找libSDL2-2.so.0文件,當執行文件時所在的目錄下沒有該文件時就會出現找不到庫文件的操作
你第二次操作時,因為function.so庫文件與a.out文件在同一個目錄,同時也是在該目錄下執行的ldd操作及運行a.out,a.out在載入動態庫時從當前目錄下找到了所需要的庫文件,此時能夠執行成功(ldd命令實質是一個腳本,通過設置環境變數運行動態庫鏈接器來輸出所有待鏈接的動態庫)。
你可以試試將a.out拷貝至其他目錄再次運行,將出現和第一次操作時一樣的現象,找不到function.so文件。
具體的解決方法就是修改編譯參數,將./libSDL2-2.so.0修改為-lSDL2-2並將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,並且可能因為沒有修改鏈接器的緩存文件(將可能找不到帶版本號後綴的動態庫),需要在/usr/lib目錄下建立一個文件連接(ln -s libSDL2-2.so.0 libSDL2-2.so)或者直接修改名稱為libSDL2-2.so
❷ 怎麼使用java連接資料庫
1、載入驅動程序。
處理結果兩種情況:
1、執行更新返回的是本次操作影響到的記錄數。
2、執行查詢返回的結果是一個ResultSet對象。
ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些 行中數據的訪問。
Statement
要執行SQL語句,必須獲得java.sql.Statement實例,Statement實例分為以下3 種類型:
1、執行靜態SQL語句。通常通過Statement實例實現。
2、執行動態SQL語句。通常通過PreparedStatement實例實現。
3、執行資料庫存儲過程。通常通過CallableStatement實例實現。
❸ 在VS2010的VC++中如何編譯、鏈接、運行、調試程序
在vc2010中看不到像VC6.0顯式的編譯、連接按鈕了。只有工具欄(啟動調試)和菜單欄(測試)
這些功能包含編譯、鏈接、運行(調試)所有步驟,都一鍵完成。
實際上這些功能是編譯器使用以下工具實現的:
編譯器CL.EXE,將.c/.cpp源代碼編譯成目標代碼.obj,
連接器LINK.EXE,將目標代碼和庫連接生成最終文件;
資源編譯器RC.EXE(.rc)將資源編譯,最終通過連接器存入最終文件.
注意編譯准備:VCVARS32.bat拷貝到當前的workspace下在cmd下執行之後就可以
直接使用這些編譯工具在cmd下編譯.
-----------------------------------------------------------
例子:記事本編輯hello.c,在按照上面要求拷貝到當前目錄下,打開cmd
CL.EXE /c hello.c只編譯不連接
LINK.EXE hello.obj 用到的庫文件,生成可執行文件.如:
LINK.EXE hello.obj user32.lib
RC.EXE Hello.rc
-----------------------------------------
CL.EXE,LINK.EXE,vcvars32.bat所在目錄:假定VS2010使用默認安裝路徑
C:Program FilesMicrosoft Visual Studio 10.0VCin
rc.exe所在路徑:
C:Program FilesMicrosoft SDKsWindowsv7.1ABin
注意:
(1)這些EXE文件在vs2010下可能存在多個不同路徑,但都是一樣的,可以通用
(2)如果電腦上安裝了不同的VS版本,這些文件會不同,注意區分。使用同一VS版本下的文件。
❹ C/C++編譯器如何通過頭文件鏈接到對應的庫文件
把自己的頭文件存為*.h文件名。然後在要調用該頭文件的程序開頭用
#include
<*.h>如果你指的是包含一個你編譯器沒有的第三方頭文件的話,那麼首先檢查該頭文件代碼是否被編譯器支持,如果支持的話使用#include包含她就可以了。
❺ Linux下編譯程序,如何同時連接兩個庫文件,gcc命令應該怎麼寫。
-L後的應該是路徑,本例應該是-L/usr/lib/,-l後應該是庫的名字,注意,這里庫的名字是吧庫"libapi.so"去掉前面的"lib"和後面的".so",應該是-lapi.而且一個-L和-l對應一個庫.所以你的應該改為:
gcc -g -o test.exe test.c -L/usr/lib/ -lapi -L/usr/lib/ -lpk11.
還有,.exe文件是windows下的可執行文件格式,linux下不這么用,但是就本例而言也能運行.
❻ c語言裡面的編譯和鏈接是怎麼回事啊
C/C++語言的完整編譯過程是
一、預編譯
處理#define #if #include這類#開頭的語句,這些稱為預編譯指令。這個過程中會把.h文件和.c/.cpp文件組合成最終交給compile過程的原文件。這個原文件是不包含任何#開頭的語句的。所有#define定義的宏也會被替換。
二、編譯
把上面那個原文件編譯成.o或者VC里是.obj文件。這個文件保存了機器碼化的函數、函數的描述、全局變數的描述、乃至段的描述等等。
三、連接
把可執行程序需要的所有的編譯過程產生的.o或者.obj文件組合到一起。(這里也包括.lib文件,.lib文件件本質上就是打包的.obj文件集合)。另外連接過程還會組合一些其他數據,比如資源、可執行文件頭等等。