2014-10-02 56 views
1

我是C編程新手,我試圖在Ubuntu 12.10上使用GCC編譯this Simple training example如何編譯這個庫的用法?

看起來像fann.h不應該包括(如文件本身所述),所以我包含了fixedfann.h。

第一次嘗試(不包括剛看到編譯器會問什麼):

$ gcc main.c -o output 
/tmp/cckKyM92.o: In function `main': 
main.c:(.text+0x62): undefined reference to `fann_create_standard' 
main.c:(.text+0x7a): undefined reference to `fann_set_activation_function_hidden' 
main.c:(.text+0x8e): undefined reference to `fann_set_activation_function_output' 
main.c:(.text+0xba): undefined reference to `fann_train_on_file' 
main.c:(.text+0xce): undefined reference to `fann_save' 
main.c:(.text+0xda): undefined reference to `fann_destroy' 
collect2: ld returned 1 exit status 

fann_create_standard是fann.h和fann.c.由於fann.h包含在fixedfann.h中,並且不應該直接包含fann.h,我相信我必須編譯fann.c和fixedfann.c,然後鏈接(告訴我我是否犯了錯誤,我我還不熟悉這個「連接」的東西)。

所以我做:

$ gcc fann/fixedfann.c -o fann/fixedfann.o 
fann/fixedfann.c:22:20: fatal error: config.h: No such file or directory 
compilation terminated. 

,然後我做:

$ gcc fann/fixedfann.c -o fann/fixedfann.o -include fann/include/config.h 
fann/fixedfann.c:22:20: fatal error: config.h: No such file or directory 
compilation terminated. 

現在,它爲什麼不在這裏找到的c​​onfig.h文件?

--update

感謝@JonathanLeffler,我可以在這裏做一些步驟。但現在我被困在:

$ gcc fann/fixedfann.c -o fann/fixedfann.o -I./fann/include/ -lm 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: ld returned 1 exit status 

,並使用grep,我找不到對文芳文件夾...還沒有功能_startmain任何參考,我不知道是誰這個鏈接crt1.o ...任何想法這裏有什麼不對?

--update2

好吧,我用Harmeet的Makefile,現在我試圖鏈接一切.o文件。 我gcc -c main.c創建的main.o,並且我想:

gcc -o output main.o fann/fixedfann.o -lm 

(-lm爲libmath,即需要)和我:

main.c:(.text+0xba): undefined reference to `fann_train_on_file' 

fann_train_on_filefann_train_data.c,所以我嘗試:

gcc -o output main.o fann/fixedfann.o fann/fann_train_data.o -lm 

,但我得到了很多multiple definition of...錯誤...的:/

看起來像fann_train_data.o已包含/鏈接,但如果是這樣,爲什麼它沒有找到fann_train_on_file

--update3

我還是很堅持在這裏...這兩條線的任何想法,其中(如果有的話)應該工作?:

gcc -o output main.o hello.o fann/fixedfann.o fann/fann_train_data.o -lm 

gcc -o output main.o hello.o fann/fixedfann.o -lm 

--update爲Harmeet

產量爲:

$ make 
gcc -L./fann -lfann main.o -o main 
main.o: In function `main': 
main.c:(.text+0x62): undefined reference to `fann_create_standard' 
main.c:(.text+0x7a): undefined reference to `fann_set_activation_function_hidden' 
main.c:(.text+0x8e): undefined reference to `fann_set_activation_function_output' 
main.c:(.text+0xba): undefined reference to `fann_train_on_file' 
main.c:(.text+0xce): undefined reference to `fann_save' 
main.c:(.text+0xda): undefined reference to `fann_destroy' 
collect2: ld returned 1 exit status 
make: *** [main] Error 1 
+0

你可能需要用'-Ifann'作爲一個額外的參數傳遞給GCC命令行。 – 2014-10-03 00:01:29

+0

'$ gcc fann/fixedfann.c -o fann/fixedfann.c -include fann/include/config.h'你覆蓋了你的源文件? – wildplasser 2014-10-03 00:01:42

+0

@wildplasser抱歉,我的意思是'$ gcc fann/fixedfann.c -o fann/fixedfann.o -include fann/include/config.h' - 我仍然收到錯誤 – 2014-10-03 00:08:58

回答

0

一個老鄉幫我,並且我們來到了編譯所有內容的這一行,並使可執行文件:

$ gcc fann/fann.c fann/fann_io.c fann/fann_train.c fann/fann_train_data.c fann/fann_error.c fann/fann_cascade.c main.c -Ifann/include -lm 

這就是答案。

也就是說,這正是fixedfann.c正在做的(包括所有這.c文件)。但是,如果我嘗試:

$ gcc fann/fixedfann.c main.c -Ifann/include -lm 

..我得到:

undefined reference to `fann_train_on_file' 

fann_train_on_filefann_train_data.c,這是由fixedfann.c包括在內,所以爲什麼它是不確定的?我不知道...:/

--update

我意識到:如果我評論fixedfann頭

$ gcc fann/fixedfann.c main.c -Ifann/include -lm 

會工作。c:

//#include "config.h" 
//#include "fixedfann.h" 

#include "fann.c" 
#include "fann_io.c" 
#include "fann_train.c" 
#include "fann_train_data.c" 
#include "fann_error.c" 
#include "fann_cascade.c" 
+0

我對你的代碼做了兩處更改 - 1)在main.c中將#include「fann/include/fixedfann.h」改爲'#include「fann.h」' 2)改變所有出現的'fann。在'fann/Makefile'中的一個''到'libfann.a',就像我上面的答案中的Makefile一樣。 然後使用下面一行來使你的主程序 - 'gcc main.c -I./fann/include -L./fann -lfann -o main' – Harmeet 2014-10-18 15:20:01

1

您可以使用ar做一個靜態庫,並與合作那。

一個Makefile下具有以下內容您hello-fann-3/fann/文件夾中創建 -

SOURCES = $(wildcard *.c) 
OBJECTS = $(SOURCES:.c=.o) 
CFLAGS = -c -Iinclude 

all: libfann.a 

libfann.a: $(OBJECTS) 
    ar rcs [email protected] $^ 

%.o: %.c 
    gcc $(CFLAGS) $^ 

然後在hello-fann-3/fann/使用make命令來構建靜態庫。以上Makefile將生成libfann.a,您可以鏈接到您的程序。

一個Makefile下具有以下內容您hello-fann-3/文件夾中創建 -

SOURCES = $(wildcard *.c) 
OBJECTS = $(SOURCES:.c=.o) 
CFLAGS = -c -I./fann/include 
LFLAGS = -L./fann -lfann 

main: $(OBJECTS) 
    gcc $(LFLAGS) $^ -o [email protected] 

%.o: %.c 
    gcc $(CFLAGS) $^ 

然後在hello-fann-3/使用make命令來構建main程序。

在你main.c,你必須包括fan.h像 -

#include "fann.h" 

如果你不理解的Makefile,你可以在這裏讀到它 -

http://www.gnu.org/software/make/manual/html_node/index.html

+0

感謝您的幫助!但是我得到'Makefile:8:*** missing separator。Stop.' at line'ar rcs $ @ $ ^'這裏......不知道爲什麼......順便說一句,這是遞歸嗎? – 2014-10-08 22:50:31

+1

@Tom Brito,在上面的makefile中,'ar'和'gcc'行必須以製表符開頭。它不能是空格! Makefile不是遞歸的。 – Harmeet 2014-10-09 02:02:18

+0

謝謝!我仍然在這裏做錯了什麼...我把Makefile放在./src/fann文件夾中(頭文件在./src/fann/include中,我應該改變這個'-Iinclude'嗎?但它編譯... ),看起來像編譯沒有問題......但是,當我做'gcc -o輸出fann/fann.a main時,我得到'main.c :(.text + 0x62):未定義的引用fann_create_standard''。 C'。這個'fann_create_standard'在fann.c:32上,我試圖找到我在這裏丟失的東西... – 2014-10-12 19:33:48

1

你只需要鏈接fann庫。

  1. 如果你手工編譯做到這一點

    gcc main.c -lfann -lm -o main 
    

    然後只需運行它像

    ./main 
    

    如果你是Ubuntu和你遇到以下錯誤

    ./main: error while loading shared libraries: libfann.so.2: cannot open shared object file: No such file or directory

    然後運行

    sudo ldconfig 
    
  2. 如果您使用的是NetBeans,然後在你的項目只需右鍵 - >屬性 - >建設 - >鏈接,然後 上的瀏覽按鈕庫部分中單擊[...],然後在在添加庫新窗口中點擊...

    然後加入文芳庫(例如我的范文芳庫路徑是:/usr/local/lib/libfann.a),然後單擊確定

+0

任何發現這個的人都不會忽略sudo ldconfig – 2017-12-01 19:48:31