Day0520

Day20210510

1.g++編譯多文個cpp件的命令

編譯單個文件:
  g++ -c 1.cpp -o 1.o
  g++ -c 2.cpp -o 2.o
  g++ 1.o 2.o -o prog

編譯並連接多個文件:
	g++ -o file file1.cpp file2.cpp

2.編譯動態依賴庫命令

2.1 linux環境下

編譯動態依賴庫:
	g++ one.cpp two.cpp three.cpp -fPIC -shared -o libtest.so
使用動態依賴庫:
	1.源碼編寫時,在另外一個cpp中include這個動態依賴庫的頭文件,然後在函數中調用該依賴庫的文件
	2.編譯時:g++ main.cpp -L. -ltest -o main
	
說明:
	-shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標誌外部程序無法連接。相當於一個可執行文件

	-fPIC:表示編譯爲位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。

	-L.:表示要連接的庫在當前目錄中

	-ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱

 	LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。

2.2 mac環境下

c++ -dynamiclib -o libtest.dylib JniTest_JavaToCplus.cpp test.cpp

3.idea 設置本地依賴庫目錄

Run/Debug Configurations的VM Options裏添加:

-Djava.library.path=/home/abc/workspace/

在代碼中動態添加:

private static void loadJNILibDynamically() {
        try {
            System.setProperty("java.library.path", System.getProperty("java.library.path")
                    + ":/home/abc/workspace/");
            Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
            fieldSysPath.setAccessible(true);
            fieldSysPath.set(null, null);
 
            System.loadLibrary("JNIC");
        } catch (Exception e) {
            ;
        }
}

4.mac下jdk相關目錄

安裝目錄:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/
jni_md.h目錄: /Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/include/darwin
jni.h目錄:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/include
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章