2016-12-04 11 views
1

我有一個名爲foo.bar的源文件,並且爲了這個問題的目的不能被重命名或鏈接到。說它是一個C++源文件。現在,我想編譯它並使用庫path/to/weird_lib_file在相同的命令中鏈接它。現在,如果源文件名是foo.cpp,我可以這樣做:使gcc -x somelang與任意庫文件鏈接,而不需要它的目錄?

gcc -o foo foo.cpp /path/to/weird_lib_file 

而且是可行的。但如果我寫

gcc -o foo -x c++ foo.cpp /path/to/weird_lib_file 

它不起作用。現在,我可以做

gcc -o foo -x c++ foo.cpp -L /path/to/ -l:weird_lib_file 

如下建議:

How to link using GCC without -l nor hardcoding path for a library that does not follow the libNAME.so naming convention?

但由於某些原因,我也不會去,我寧願不-L該文件夾。我仍然可以強制GCC以某種方式鏈接到該單個庫文件嗎?看起來-l:/path/to/weird_lib_file不起作用。

回答

1

如果你沒有-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沒有被使用)。

+0

這對我不起作用......嗯......也許我從上面的例子中刪除了一些開關。讓我編輯它。 – einpoklum

+0

好的,完成後,請參閱修改。 – einpoklum

+0

太棒了,謝謝。我沒有意識到我可以兩次使用-x。所以,如果你有興趣,[這裏](http://stackoverflow.com/a/40665580/1593077)是動機(儘管庫名實際上以'.so'結尾)。 – einpoklum