2011-11-21 75 views
0

僅供參考,以建立一個源代碼樹:所有的工作可以在TRAC回購可以看出@http://matthewh.me/scripts/browser/c/shared_library?order=name如何使用多個Makefile文件


原來的職位是長。它主要問到爲什麼我的Makefiles在從根目錄構建時找不到任何源代碼。


UPDATE: 我沒有發現的路徑都是相對於根目錄下,無論在哪裏makefile文件被放置。

我現在已經建立了libs,但是在編譯應用程序時,我得到了一個未定義的main參考。

我不會粘貼更新的makefile,但源代碼樹現在看起來像:

[email protected]:~/Code/shared_library$ make 
gcc -c -o ./c_lib/c_lib.o ./c_lib/c_lib.c 
rm -f ./c_lib/libClib.so.1.0.0 ./c_lib/libClib.so ./c_lib/libClib.so.1 ./c_lib/libClib.so.1.0 
gcc -m32 -Wl,-O1 -shared -o ./c_lib/libClib.so.1.0.0 -lpthread 
ln -s ./libClib.so.1.0.0 ./c_lib/libClib.so 
ln -s ./libClib.so.1.0.0 ./c_lib/libClib.so.1 
ln -s ./libClib.so.1.0.0 ./c_lib/libClib.so.1.0 
rm -f ./c_lib/libClib.a 
ar cqs ./c_lib/libClib.a ./c_lib/c_lib.o 
cc -c -m32 -pipe -O2 -Wall -W -D_REENTRANT -I./c_lib/ -o ./app/main.o ./app/main.c 
gcc -m32 -Wl,-O1 -o ./app/main.o -L./c_lib/ -lClib 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: ld returned 1 exit status 
make: *** [app/main] Error 1 
[email protected]:~/Code/shared_library$ ls -lR 
.: 
total 12 
drwxr-xr-x 2 mehoggan mehoggan 4096 2011-11-20 20:23 app 
drwxr-xr-x 2 mehoggan mehoggan 4096 2011-11-20 20:23 c_lib 
-rw-r--r-- 1 mehoggan mehoggan 824 2011-11-20 19:50 Makefile 

./app: 
total 8 
-rw-r--r-- 1 mehoggan mehoggan 291 2011-11-20 18:52 main.c 
-rw-r--r-- 1 mehoggan mehoggan 503 2011-11-20 20:23 Makefile 

./c_lib: 
total 28 
-rw-r--r-- 1 mehoggan mehoggan 245 2011-11-20 18:54 c_lib.c 
-rw-r--r-- 1 mehoggan mehoggan 46 2011-11-20 19:53 c_lib.h 
-rw-r--r-- 1 mehoggan mehoggan 864 2011-11-20 20:23 c_lib.o 
-rw-r--r-- 1 mehoggan mehoggan 1008 2011-11-20 20:23 libClib.a 
lrwxrwxrwx 1 mehoggan mehoggan 18 2011-11-20 20:23 libClib.so -> ./libClib.so.1.0.0 
lrwxrwxrwx 1 mehoggan mehoggan 18 2011-11-20 20:23 libClib.so.1 -> ./libClib.so.1.0.0 
lrwxrwxrwx 1 mehoggan mehoggan 18 2011-11-20 20:23 libClib.so.1.0 -> ./libClib.so.1.0.0 
-rwxr-xr-x 1 mehoggan mehoggan 6588 2011-11-20 20:23 libClib.so.1.0.0 
-rw-r--r-- 1 mehoggan mehoggan 930 2011-11-20 20:20 Makefile 

main.c中的內容是:

#include <stdio.h> 
#include "c_lib.h" 

int main(int argc, char *argv[]) 
{ 
    if (argc > 1) { 
     char *arg = argv[1]; 
     printf("%s\n", arg); 
    } 

    char str[12] = "hello world\0"; 
    printf("%s\n", str); 
    char *rev = reverse(str); 
    printf("%s\n", rev); 
    return 1; 
} 

爲什麼編譯器找不到主功能?


UPDATE

你修復幫助獲得通過未定義的引用爲主,但我現在越來越另一個不確定參考:

[[email protected] shared_library]$ make 
gcc -c -m32 -pipe -O2 -Wall -W -D_REENTRANT -fPIC -I. -o ./c_lib/c_lib.o ./c_lib/c_lib.c 
rm -f ./c_lib/libClib.so.1.0.0 ./c_lib/libClib.so ./c_lib/libClib.so.1 ./c_lib/libClib.so.1.0 
gcc -m32 -Wl,-O1 -shared -o ./c_lib/libClib.so.1.0.0 -lpthread 
ln -s ./libClib.so.1.0.0 ./c_lib/libClib.so 
ln -s ./libClib.so.1.0.0 ./c_lib/libClib.so.1 
ln -s ./libClib.so.1.0.0 ./c_lib/libClib.so.1.0 
rm -f ./c_lib/libClib.a 
ar cqs ./c_lib/libClib.a ./c_lib/c_lib.o 
gcc -c -m32 -pipe -O2 -Wall -W -D_REENTRANT -I./c_lib/ -o ./app/main.o ./app/main.c 
gcc -m32 -Wl,-O1 -o ./app/main -L./c_lib/ -lClib ./app/main.o 
./app/main.o: In function `main': 
main.c:(.text+0x49): undefined reference to `reverse' 
collect2: ld returned 1 exit status 
make: *** [app/main] Error 1 

如果有在一個可讀的字符串。所以表示反向的文件在那裏?

[[email protected] shared_library]$ strings ./c_lib/libClib.so.1 
__gmon_start__ 
_init 
_fini 
__cxa_finalize 
_Jv_RegisterClasses 
libpthread.so.0 
libc.so.6 
_edata 
__bss_start 
_end 
GLIBC_2.1.3 

回答

2

的gcc -m32輪候冊,-O1 -o ./app/main.o -L./c_lib/ -lClib

你必須在變量設定輸出錯誤文件,而下一個參數(main.o)被解釋爲輸出。因此main.o沒有加載,也沒有鏈接。