2017-02-22 40 views
-1

我在寫簡單的makefile項目。如何鏈接不同目錄中的對象(運行ld)

我想分兩個步驟建立程序:

  1. 編譯源文件
  2. 鏈接的對象和保存的目標文件在不同的目錄成可執行

考慮的東西簡單如:

all: 
    gcc -o ~/some_dir/main.o -c main.c 
    ld -o my_program main.o 

問題是調用directo ry不是「〜/ some_dir」,所以ld沒有找到目標文件......我如何在ld搜索路徑中包含「some_dir」?

從更全局的角度來看,我有各種目錄中的對象文件,我想用單個鏈接器命令文件將它們鏈接在一起。

謝謝。

+0

嗯,通過指定一個可用的路徑來鏈接對象?你會怎麼做?但任何方法,通常最好使用'gcc'作爲鏈接器驅動程序,而不是直接調用鏈接器:'gcc -o my_program〜/ some_dir/main.o'。 –

+0

另外,不是使用綁定到當前用戶的主目錄('〜/ some_dir')的路徑,將構建的文件放在相對於構建的工作目錄的位置並找到與該目錄相關的源文件會更聰明包含Makefile。 –

回答

0

你所做的事情要比他們需要的複雜得多,應該讓make爲你做更多的工作。下面是你簡單的例子重新編寫

SRCS=main.c 
BUILDDIR=~/somedir 
OBJS=$(SRCS:%.c=$(BUILDDIR)/%.o) 
CFLAGS=-g 

all: my_program 

my_program: $(OBJS) 
     $(CC) $(CFLAGS) -o [email protected] $^ 

$(BUILDDIR)/%.o: %.c 
     $(CC) $(CFLAGS) -c -o [email protected] $^ 

它定義在頂部,如索馬里紅新月會,其中將包括源文件的列表,在這裏你存儲的目標文件,並生成目錄的若干變量你將要建立什麼目標文件的列表。然後它使用$(OBJS)來定義它們是my_program的依賴關係。 make規則中的$ @是一個變量,意思是「我們正在構建的東西」,$ ^是依賴關係列表。您可以將其他依賴關係添加到my_program,並且不需要更改正在運行的命令。

然後有一個規則定義如何從當前目錄中的源文件構建$(BUILDDIR)中的目標文件。