編譯思路
A. APK反編譯思路求解
如果別人的APP進行了代碼混淆以防止反編譯,如果你沒有口令的的話,你是很難或者說幾乎不可能反編譯成功的,除非你知道混淆密碼,或者通過其他特殊軟體或者手段。
B. NCNN編譯問題匯總
錯誤如下:
./obj/local/armeabi-v7a/libetcard.a(EtEncryptedDataReader.o):EtEncryptedDataReader.cpp:typeinfo for EtCard::EtEncryptedDataReader: error: undefined reference to 'typeinfo for etncnn::DataReader'
collect2.exe: error: ld returned 1 exit status
解決方案:
① 找到編譯的Application.mk文件
② 找到如下參數配置: APP_CPPFLAGS := -frtti -std=c++11
③ 刪除黑體部分"-frtti"配置
以上方法以-frtti為例,解決思路由於編譯ncnn-include庫的時候在編譯命令中沒有加-frtti的,所以導致ndk編譯ncnn出現
無法找到此庫,因此會出現如上相似的錯誤
錯誤如下:
解決方案:
Application.mk文件中添加->APP_CPPFLAGS += -fexceptions
如下圖,編譯發現兩個方法找不到。
我們可以分析的點如下:
① 找不到2個方法,但是其他同類的ncnn方法沒有異常
② 仔細檢查頭文件,是否包含net.h的介面定義,結果是都引入了(否則其他方法會報錯)
③ 最後分析無果,可以確定的是,這兩個方法,確實目前的環境下無法鏈接到。
以上分析之後, 總結我們其他方法可以正常引用,說明ncnn庫鏈接沒問題,其次,只有這兩個方法找不到,說明我們目前編譯環境可能不包含此方法。
所以我們可以得知方法來源為ncnn的庫,也就是說我們當前使用的ncnn庫不包含此方法。
有了這個思路我們嘗試更新了一下新的ncnn庫,最終問題得到解決可以編譯成功。
C. linux 下怎麼編譯exosip
無論是哪一種程序,在Linux 系統下進槐改閉行編譯的思路都是差不多的:首先要有 C 語言(或者別的語言)的源程序,然後使用相配套的編譯器對源程序進行編譯,生成中間代碼(注意:此時還不是最終的可執行文件)、最後還必須要將前面編譯好的中間代碼和Linux 系統提供的庫文件(*.lib,殲凳或者 *.o)進行有效鉛裂的鏈接,最後生成一個可執行的二進制代碼程序。
D. c語言編譯,0.1mm紙對折幾次後厚度可達(再對折一次就超過)468米,要求輸出每一次折疊後的高度
一、思路:
每次折疊乘2。循環直到超出468。每次循哪慧鄭返環計算變數累李叢答加1。
二、代碼:
#include<stdio.h>
int main()
{
int cnt=0;
float h=0.1;
while(1)
{
h=h*2;
if(h>468)
break;
cnt++;
printf("折疊%d次,折疊後高度%.1f\n",cnt,h);
}
printf("共折疊%d次\n",cnt);
return 0;
}
//手機打的代碼,自己退格對齊一下。
E. 請教xilinx中如何編譯C語言給個大體的思路就行,謝謝。
應該對你有幫助的!如果做FPGA邏輯的話,是不可能編譯C語言的只能用verilog和VHDL
F. 動態庫編譯詳解
當前類介紹:upper.c ( upper) 依賴於 bottom.c(play)
說明:當執行可執行程序的時候,需要去/lib. /user/lib下和LD_LIBRARY_PATH下尋找so.並不會在當前目錄下尋找.
所以執行./main.out會報錯.如下:
解決方案:指定.so運行搜尋路徑
1.-Wl,-rpath ./mypath 加入參數,並且將libplay.so 到./mypath目錄下.
2.設置LD_LIBRARY_PATH,指定目錄.
說明:指定了-Wl,-rpath, 設置LD_LIBRARY_PATH也是可以生效的.並不是說只會去-Wl,-rpath下尋找.
首先生成一個bottom.so,然後用upper.so去依賴bottom.so, 然後main.c 再去依賴upper.so.
說明:這里編譯的時候直接出錯,是因為沒有指定搜尋路徑,所以無法通過編譯.
解決編譯問題方案.
1.我們依然採用LD_LIBRARY_PATH的方式可以解決編譯和運行的問題.
2.生成libplay的時候,直接指定-Wl,-rpath 給libbottom.可以解決編譯不通過的問題.
3.依賴所有庫
依賴所有庫只能解決編譯問題,無法處理運行的路徑.
另一種思路:我們在執行main.out的時候 執行-Wl,-rpath.並不在生成libplay的時候指定,看下是否正常.
由此可見,-Wl,-rpath 只能針對直接依賴的libplay.so指定了路徑,但是libbottom還是無法查找到 .但是LD_LIBRARY是可以的.
rpath只能對直接依賴的so設置搜尋目錄,並且可以設置所有依賴的編譯路徑.
總結: 解決編譯問題,在生成libplay的時候指定-Wl,-rpath運行路徑,或者設置LD_LIBRARAY_PATH,都可以解決這個問題.
當我們現在擁有的so包含一個直接依賴的so和很多間接依賴的so,但是沒有設置rpath.所以是不能直接依賴主so進行編譯和運行的.
為了通過編譯:
1.在只鏈接主so的情況下可以去設置rpath或者LD_LIBRARY_PATH.
2.或者鏈接所有so.
為了通過運行:
為了正常運行可以設置LD_LIBRARY_PATH.
--disable-new-dtags,---dt-needed-entries
結論概述:
1.我們在生成間接依賴的庫的時候,為了保證其他庫可以直接依賴,需要加入-Wl,-rpath.保證編譯通過.
2.LD_LIBRARY_PATH可以解決一切編譯運行問題.
G. 從思路開始 java如何實現條件編譯的技巧
條件編譯絕對是一個好東西。如在C或Cpp中,可以通過預處理語句來實現條件編譯。代碼如下:
#IFDEF DEBUG#UNDEF DEBUG#ENDIF #define DEBUG #IFDEF DEBUUG /* code block 1 */#ELSE /* code block 2 */#ENDIF
但是在JAVA中卻沒有預處理,宏定義這些東西,而有時我們可能需要條件編譯。那麼,在JAVA中,該如何實現條件編譯呢?
我們來看一個例子。
編寫一個helloworld程序。代碼如下:
public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); }}
保存為Hello.java並編譯,得到一個class文件,並且觀察到文件大小是417位元組。然後我們對這個文件進行反編譯,用jd-gui。得到代碼如下:
import java.io.PrintStream;public class Hello { public static void main(String[] paramArrayOfString) { System.out.println("Hello, world!"); }}
得到這個有什麼用呢?
現在我們再來對源代碼進行修改,修改後的代碼如下。
public class Hello { public static void main(String[] args) { if(false) { System.out.println("Hello, world!"); } }}
進行編譯,這時我們再看它的大小,只有255位元組。怎樣?想到什麼了吧?沒錯,編譯器會對代碼進行優化,對於條件永遠為false的語句,JAVA編譯器將不會對其生成位元組碼。
H. java中的編譯與反編譯
一、什麼是編譯
1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。
2、用編譯程序產生目標程序的動作。編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優化;目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。
二、什麼是反編譯
計算機軟體反向工程(Reverseengineering)也稱為計算機軟體還原工亂陸程,是指通過對他人軟體的目標程序(可執行程序)進行「逆向分析、研究」工作,以推導出他人的軟體產品所使用的思路、原理、結構、演算法、處理過程、運行方法等設計要素,某些特定情況下可能推導出源代碼。反編譯作為自己開發軟體時的參考,或者直接用於自己的軟體產品中。
三、Java類的編譯與反編譯
我們在最宴陪岩初學習Java的時候,會接觸到兩個命令:javac和java,那個時候我們就知道,javac是用來編譯Java類的,就是將我們寫好的helloworld.java文件編譯成helloworld.class文件。
class文件打破了C或者C++等語言所遵循的傳統,使用這些傳統語言寫的程序通常首先被編譯,然後晌御被連接成單獨的、專門支持特定硬體平台和操作系統的二進制文件。通常情況下,一個平台上的二進制可執行文件不能在其他平台上工作。而Javaclass文件是可以運行在任何支持Java虛擬機的硬體平台和操作系統上的二進制文件。
那麼反編譯呢,就是通過helloworld.class文件得到java文件(或者說是程序員能看懂的Java文件)
四、什麼時候會用到反編譯
1、我們只有一個類的class文件,但是我們又看不懂Java的class文件,那麼南邵java培訓認為可以把它反編譯成我們可以看得懂的文件。
2、學習Java過程中,JDK的每個版本都會加入越來越多的語法糖,有些時候我們想知道Java一些實現細節,我們可以藉助反編譯。
I. 要實現一個簡單的過程式控制制,程序編制的思路及步驟有哪些
//以Helloworld示例
//先使用編輯工具如windows的記事本或vc++環境,或linux的vim編輯器創建一個hello.c文件棗拿肢
//打開文件後,如下 步驟寫程序
#include <stdio.h>//首先要引入c語言的標准輸入輸出庫文件,因為這個文件里有已經定義好的可以使用的凳世函數
//接下來需要寫一個main函數,這也是c語言程序里必不可少的一個函數,叫主函數,他是整個程序的入口函數,程序所有的功能實現都要在這個函數中體現。但是這個函數有且僅有一個
int main()
{
//這是main函數的函數體,要實現什麼功能,就把實現功能的語句寫到這裡面
//比如我要實現列印HelloWorld字元,那麼我就調用printf()標准輸出語句
printf("Hello World!\n");//這個語句表示原樣輸出引號內的字元,『\n』表示換行
return 0;//最後,因為main函數有一個int的返回類型限定,那麼我們使用return語句返回一個int類型的值 0.
}
//這樣就結束了。一個簡單的但又完整的C程序就有了,
//下一步就是使用編譯器編譯成目標的可執行文件:
//如果是windows下的vc++,那麼需要敏鎮分別點擊編譯,鏈接兩個按鈕生成hello.exe可執行文件
//如果是linux下直接在shell中使用gcc hello.c就可以編譯成可執行文件a.out
//最後就是運行了,windows下直接點擊vc++的運行或雙擊hello.exe可以出現dos窗口運行,並顯示結果,linux下使用「./a.out」可以直接運行,運行結果會顯示在shell中。
//這就是整個完整的流程,包括每一步。如果幫助到你,請你採納為答案。謝謝。
J. 編譯原理中的文法設計這題該怎麼做,能給一下思路和答案嗎
文法的設計需要考慮文法的類型和表達能力。一種可能的思路是:
首先,確定值為非負的5的倍數或3的李臘消倍數的數字串有什麼特徵,例如結尾只能是0或5或3或6或9,不能有前導0等。
然後,選擇合適的文法類型來描述這些特徵,例如正規文法、上下文無關文法等。
最後,根據文法類哪知型的規則,給出局寬產生式和開始符號。
使用正規文法來描述這個語言。
產生式如下:
- S -> 0 | 3 | 5 | 6 | 9
- S -> A0 | A3 | A5 | A6 | A9
- A -> S
- A -> AA
開始符號為S。
一種可能的答案是: