1. 程式人生 > >C語言(一個真實的故事)

C語言(一個真實的故事)

曾經有一個簡單又不失牛逼的小技巧,老師教的時候我沒有珍惜,等到同事因為用了這個技巧升任總工才後悔莫及,如果上天再給我一次機會,我會對老師說:我要學!如果非要定個學習時間,我希望是:立馬!

拓展:

這是一個真實的故事。

一個以往的學生就職東莞易事特,一家做新能源的上市公司,去年年底升任其部門總工(軟體開發總工程師)工資升到1.2w,我說你工作半年這麼NB了?他說,是因為他們部門太弱雞了,整個部門就他一個人懂外掛式連結動態庫。我說:啥?外掛式?連結動態庫? 我教過你嗎?你丫說的不會是dlsym()和dlopen()這幾個函式吧?他說:是的。[陰險][陰險] 我說:NB,會包裝就是不一樣,外掛式!你小子離征服世界不遠了!

扯回來,他說的沒錯,這個讓普工變總工的牛逼吊炸天的知識點,就是所謂的動態連結動態庫。我們都知道,為了減少程式碼的尺寸,我們會盡量將程式碼封裝到動態庫裡面,比如我們將吃飯(have_meal())、理髮(hair_cut())封裝在一個叫life的動態庫裡:

liblife1.so

通常,我們會在使用了這個庫程式碼的程式編譯時加上鍊接選項,例如:

gcc main.c -o main -llife1

這樣,程式執行所需要的吃飯(have_meal())、理髮(hair_cut())的程式碼就跟main.c程式分離,達到可以給多個程式共用liblife.so從而節省程式碼量的目的,但是這個做法有一個侷限性,那就是當吃飯、理髮的函式介面不變,但是內部實現功能發生了改變的時候,我們需要重新執行編譯命令,或者重新連結不同的庫。例如:

gcc main.c -o main -llife2

這樣很不方便,那怎樣才能不修改原始碼,也不需要重新編譯main.c,直接讓程式執行的時候動態地決定呢? 答案就是使用動態連結動態庫。

在main.c中,這麼寫你的程式碼:

注意到上面的提薪大招了嗎? dlopen()和dlsym(),dlopen用來指定動態庫,並使用dlsym來獲取動態庫裡面的某一函式(比如hava_meal),這樣一來,只要傳給main的引數argv[1]不同,就可以獲取和連結不同的動態庫,只要這些函式介面一樣即可。

例如上面的例子,在執行main程式的時候,就變成:

./main liblife1.so (呼叫life1裡面的吃飯、理髮的函式)

./main liblife2.so (呼叫life2裡面的吃飯、理髮的函式)

至此,問題完美解決。一個小小知識點,改變一個人的職業生涯。