2014-10-06 68 views
0

我試圖運行名爲grover.c .c文件在這個C應用程序li​​bquantumLibquantum代碼理解的Makefile

www.libquantum.de/files/libquantum-1.1.1.tar.gz現在

我這個應用程序已經包含了Makefile.in,我可以使用命令

./configure 
make 
make demos 

生成一個名爲紹爾和格羅弗可執行但是當我嘗試運行grover.c使用gcc或部族這樣

鏗grover.c

它給了我很多未定義函數引用的錯誤。

在功能oracle': grover.c:(.text+0x50): undefined reference to quantum_sigma_x ' grover.c :(文本+ 0x89上):未定義參照quantum_toffoli' grover.c:(.text+0xc8): undefined reference to quantum_toffoli' grover.c :(文本+ 0xf2):未定義參照quantum_cnot' grover.c:(.text+0x137): undefined reference to quantum_toffoli」 grover.c: (.text + 0x16b):未定義的引用quantum_toffoli' grover.c:(.text+0x1b0): undefined reference to quantum_sigma_x'

我需要知道如何刪除此錯誤,如果我可以在此應用程序中運行此c代碼,稱爲grover.c。

感謝,

+1

我想你誤解了編譯器的工作。要運行grover,只需輸入「grover」,就不需要調用clang。 – Beta 2014-10-06 01:11:16

+0

但是當我需要編譯一個C代碼時,我會像clang hello.c或gcc hello.c那樣執行一些操作,並創建一個可執行文件。在這種情況下,我需要運行這個grover.c文件。實際上,我想在另一個軟件中運行這個文件來分析它的處理器使用情況。 – jav321 2014-10-06 01:20:57

+1

如果你看看makefile,你可能會看到很多東西。如果你看看'clang grover.c',你可能會看到缺乏很多東西。這就是爲什麼它不適合你。你不能只從一個大型項目中去掉單個源文件,並希望能夠把它變成一個可執行文件。它在圖書館項目中的實際情況非常強烈地表明,它將使用該圖書館中的一些功能,這是你不需要的。 – 2014-10-06 01:56:54

回答

0

它看起來像你的編譯器不能找到一個或多個庫鏈接。我的直覺是makefile有適當的命令來調用鏈接器。

如果你看一下你的makefile,你可能會看到這樣-L -l, 一些命令當標誌-L添加一個目錄,用於圖書館和標誌-l默認的搜索路徑來命名庫鏈接。

例如-L/lib/openGL -lglut32會導致在目錄/ lib/openGL中找到的庫libglut32.so.X.Y.Z。 (不是用於Linux系統,但它應該與Mac非常相似)。

N.B. X.Y.Z是庫的版本號。

一旦你解決了這個問題,查找庫的負載可能會有問題,特別是如果它們位於非標準位置。

------------------------編輯--------------------- -----

當我發佈這個,並上牀後,我意識到我錯過了一個潛在的案例(並感謝保羅格里菲斯也注意到我的遺漏.....教我一次做多件事)。

只要編譯一個簡單的文件hello.c就可以,因爲一切都在一個文件中,而clang會自動鏈接到C運行庫。

如果在你的情況下,代碼在多個文件傳播,說grover.c和file1.c中,你需要做的:

clang -c grover.c -o grover.o 
clang -c file1.c -o file1.o 
clang grover.o file1.o -o grover 

(或alteratively鐺grover.c文件1。c -o grover)

因此,前兩行所做的是將源代碼文件(grover.c和file1.c)轉換爲目標文件。第三行將兩個目標文件覆蓋到可執行文件中。

最後,這兩種情況都可能涉及。你可能有多個文件以及缺少的庫。

+1

'grover.c'只是組成應用程序'grover'的許多源文件中的一個,而且僅僅鏈接庫是不夠的。 – 2014-10-06 02:29:48

+0

我可以在make文件中使用此信息: grover:libquantum.la grover.c Makefile \t $(LIBTOOL)--mode = link $(CC)$(CFLAGS)-o grover grover.c -I./ \ \t -lquantum -static -lm 給GCC生成可執行文件的適當命令? – jav321 2014-10-07 13:36:23

+0

@ jav321是的。 makefile只是一個簡單的例子,然後是一個驅動GCC的腳本。你需要做的是確定變量CC和CFLAGS包含什麼。歷史上,變量CC包含編譯器名稱(在你的情況下,我猜它可能是gcc),並且CFLAGS包含傳遞給編譯器的標誌和選項。剩下的行'-I./ -lquantum -static -lm'將被原樣使用(我認爲你的註釋中的\是makefile中的續行字符)。如果您有任何其他問題,請詢問。 – thurizas 2014-10-07 13:59:49