2016-09-16 48 views
1

我有一個C代碼,我想通過創建一個共享對象並在R中動態加載該對象來調用R中的函數。在R中創建共享對象的代碼是:從C代碼創建共享對象R

R CMD SHLIB myfile.c 

與一般的方法是:

gcc -c -Wall -Werror -fpic myfile.c 
gcc -shared -o myfile.so myfile.o 

我想知道是否有在R的使用方面那些不同的代碼創建的兩個myfile.so文件之間有什麼區別這兩個文件的大小是相當不同的(17KB和32KB),這令人困惑我。

回答

1

當你

gcc -c -Wall -Werror -fpic myfile.c 
gcc -shared -o myfile.so myfile.o 

你錯過了幾個標誌是R CMD SHLIB需要,像優化標誌-O2,調試標誌-g等爲什麼不看看什麼是打印在屏幕上,當你做:

R CMD SHLIB myfile.c 

我提到的標記對代碼大小以及編譯代碼的效率都有影響。生成的目標代碼是不同的。您可以使用反彙編器:

objdump -d myfile.so 

檢查(二進制)彙編代碼以及代碼大小。您還可以使用

gcc -S -Wall -Werror -fpic myfile.c 

檢查(可讀)彙編代碼。無論您是否使用-O2,您都會看到巨大的差異。


Godbolt compiler explore是一個GUI交互式彙編程序。您在左側窗口中輸入C代碼,然後選擇編譯器,編譯標誌,輸出顯示配置等,然後彙編代碼將在右側窗口中生成。這對HPC代碼編寫者評估和優化代碼非常方便。對你而言,這是比較目標代碼差異的便捷方法。