如果你沒有-L
這個庫的路徑,你可能用 來指定這個庫的絕對或相對路徑名。在 後一種情況下,無論調用哪個庫,都會將 用作鏈接器輸入,除非它具有使其 看起來是源文件的擴展名。因此
gcc -o prog main.c foo.xyz
將編譯main.c
和鏈路main.o
與庫./foo.xyz
如果在 實際上它是一個,不論是靜態的或共享的,能夠滿足的聯繫。
後來
(編輯之前,這個問題並沒有提到-x
選項)。
引進-x
選項如:
gcc -o prog -x c++ main.cpp foo.xyz
將產生一個錯誤,如:
foo.xyz:2:1: error: stray ‘`’ in program
/ 0 0 0 0 16 `
^
foo.xyz:3:1: warning: null character(s) ignored
T_Z3foov foo.o/ 0 0 0 644 1544 `
^
foo.xyz:3:4: error: stray ‘\1’ in program
T_Z3foov foo.o/ 0 0 0 644 1544 `
^
...
...
即使foo.xyz
實際上能夠滿足鍵的文庫, 打算由非正統的名字。
因爲它必須,因爲-x c++
指示gcc將隨後的輸入文件 解釋爲C++源代碼,直到另行通知。作爲documented
-x語言
明確指定爲後面的輸入文件(而不是 讓編譯器選擇基於文件名後綴默認)的語言。 此選項適用於所有後續輸入文件,直到下一個-x選項。
並且進一步的通知永遠不會來。
當然,在這種情況下不會發生這種情況,例如,的:
gcc -o prog -x c++ main.cpp -L. -l:foo.xyz
因爲-l:foo.xyz
不是輸入文件,但一個連接器選項(其在與-L.
聯用,指定的輸入文件)。
爲了避免這種結果,你必須刪除堅持認爲foo.xyz
是 一個C++源文件通過到達之前,像取消-x c++
:
gcc -o prog -x c++ main.cpp -x none foo.xyz
由於記載:
-x無
關閉任何語言規範,以便根據文件處理後續文件 名稱後綴(因爲如果-x沒有被使用)。
這對我不起作用......嗯......也許我從上面的例子中刪除了一些開關。讓我編輯它。 – einpoklum
好的,完成後,請參閱修改。 – einpoklum
太棒了,謝謝。我沒有意識到我可以兩次使用-x。所以,如果你有興趣,[這裏](http://stackoverflow.com/a/40665580/1593077)是動機(儘管庫名實際上以'.so'結尾)。 – einpoklum