2012-08-05 634 views
0

我對makefile非常陌生。我正在閱讀GNU-make手冊,但是我仍然不清楚如何在編譯器和鏈接器被隱式規則執行時設置參數。 這是生成文件的一部分,注意,是如何編譯和鏈接都沒有明確的聲明:Makefile:爲由隱式規則執行的命令設置參數(CFLAGS,LDFLAGS)

.PHONY: $(TARGET) build_libs 

all: build_libs $(TARGET) 

$(TARGET): 
    @echo "============> building target: $(TARGET)" 
    @$(MAKE) -C $(SDK_PATH)/VP_SDK/Build $(TMP_SDK_FLAGS) $(SDK_FLAGS) $(MAKECMDGOALS) USE_LINUX=yes 
    mv $(ARDRONE_TARGET_DIR)/ardrone_testing_tool $(TARGET) 
    mv $(TARGET) $(ARDRONE_TARGET_DIR)/ 
    @echo "============> end building target: $(TARGET)" 

$(MAKECMDGOALS): build_libs 
    @echo "============> making cmd goals" 
    @$(MAKE) -C $(SDK_PATH)/VP_SDK/Build $(TMP_SDK_FLAGS) $(SDK_FLAGS) $(MAKECMDGOALS) USE_LINUX=yes 
    @echo "============> end making cmd goals" 

build_libs: 
    @echo "============> building libs" 
    @$(MAKE) -C $(SDK_PATH)/Soft/Build $(TMP_SDK_FLAGS) $(SDK_FLAGS) $(MAKECMDGOALS) USE_LINUX=yes 
    @echo "============> end building libs" 

這Makefile將源文件和庫的可執行文件。但我想將它們編譯成共享庫。因爲我(我想)必須將-fPIC參數添加到cc-shared-soname參數到ld。我試過CFLAGS=-fPICLDFLAGS=-shared -soname foo,這沒有奏效。有沒有人建議如何獲得共享的libarary?如果您需要更多信息,請直接詢問。提前致謝!

UPDATE:在$(SDK_PATH)生成文件/柔和/編譯:

GEN_CUSTOM_HEADER:=../Common/generated_custom.h 

include custom.makefile 
include config.makefile 

GNUTOOLS_PATH=/usr/local/$(GNUTOOLS_VERSION)/bin 

define ADD_RULE_TEMPLATE 
    TO_BUILD+=build_$(1) 
endef 

# Add rule for each target 
$(foreach target,$(TARGETS),$(eval $(call ADD_RULE_TEMPLATE,$(target)))) 

.PHONY: linux_sample svn_update $(TO_BUILD) build_libs $(MAKECMDGOALS) 

all: $(GEN_CUSTOM_HEADER) build_libs $(TO_BUILD) 

$(GEN_CUSTOM_HEADER): custom.makefile 
    @echo "#ifndef _GENERATED_CUSTOM_CONFIGURATION_H_" > [email protected] 
    @echo "#define _GENERATED_CUSTOM_CONFIGURATION_H_" >> [email protected] 
    @echo >> [email protected] 
    @echo "#if defined(BR2_PACKAGE_BCM4318_AP)" >> [email protected] 
    @echo "# define AP" >> [email protected] 
    @echo "#else" >> [email protected] 
    @echo "# define STA" >> [email protected] 
    @echo "#endif" >> [email protected] 
    @echo "#define CURRENT_NUM_VERSION_SOFT \"$(MAJOR_VERSION).$(MINOR_VERSION).$(MODIF_VERSION)\"" >> [email protected] 
    @echo "#define CURRENT_BUILD_DATE \"$(shell date +%F\ %H:%M)\"" >> [email protected] 
    @echo >> [email protected] 
ifeq ("$(VIDEO_YUV)","yes") 
    @echo "#define USE_VIDEO_YUV" >> [email protected] 
endif 
ifeq ("$(RECORD_VISION_DATA)","yes") 
    @echo "#define RECORD_VISION_DATA" >> [email protected] 
endif 
    @echo >> [email protected] 
    @echo "#define WIFI_NETWORK_NAME \"$(WIFI_NETWORK_NAME)\"" >> [email protected] 
    @echo "#define WIFI_BROADCAST \"$(WIFI_BROADCAST)\"" >> [email protected] 
    @echo "#define WIFI_ARDRONE_IP \"$(WIFI_ARDRONE_IP)\"" >> [email protected] 
    @echo >> [email protected] 
    @echo "#if defined(__linux__) || defined(USE_MINGW32)" >> [email protected] 
    @echo "# define WIFI_MOBILE_IP \"$(WIFI_MOBILE_IP)\"" >> [email protected] 
    @echo "# define WIRED_ITFNAME \"$(WIRED_ITFNAME)\"" >> [email protected] 
    @echo "#endif // ! __linux__" >> [email protected] 
    @echo >> [email protected] 
    @echo >> [email protected] 
    @echo "#endif // ! _GENERATED_CUSTOM_CONFIGURATION_H_" >> [email protected] 

ifneq "$(MAKECMDGOALS)" "" 
    ifneq "$(MAKECMDGOALS)" "clean" 
    ifneq "$(MAKECMDGOALS)" "update" 
     $(MAKECMDGOALS): 
     @echo -e "\nCannot make what you ask me to do :-(" 
    else 
     $(MAKECMDGOALS): svn_update 
    endif 
    endif 
endif 

$(MAKECMDGOALS): build_libs $(TO_BUILD) 

checkpackages: 
ifeq ($(IPHONE_MODE),yes) 
    sh $(shell pwd)/check_dependencies.sh iphone RELEASE_BUILD=$(RELEASE_BUILD) $(MAKECMDGOALS) 
else 
ifeq ($(USE_LINUX),yes) 
    sh $(shell pwd)/check_dependencies.sh static RELEASE_BUILD=$(RELEASE_BUILD) $(MAKECMDGOALS) 
else 
ifeq ($(USE_ANDROID),yes) 
    sh $(shell pwd)/check_dependencies.sh android_no_neon RELEASE_BUILD=$(RELEASE_BUILD) $(MAKECMDGOALS) 
endif 
endif 
endif 

define GENERIC_RULES_TEMPLATE 
build_$(1): 
    @$(MAKE) -C $(1) $(MAKECMDGOALS) 
endef 

$(foreach target,$(TARGETS),$(eval $(call GENERIC_RULES_TEMPLATE,$(target)))) 

build_libs: checkpackages 
    @$(MAKE) PC_TARGET=yes USE_ARDRONE_TOOL=yes TARGET=pc_ USE_MINGW32=no -C ../Lib/Build $(MAKECMDGOALS) 
    @$(MAKE) PC_TARGET=yes USE_ARDRONE_TOOL=no TARGET=pc_ USE_MINGW32=no -C ../Lib/Build $(MAKECMDGOALS) 

ifeq ("$(MINGW32_MODE)","yes") 
ifeq ($(shell which i586-mingw32msvc-gcc 2> /dev/null),) 
     $(warning You need MinGW32 to compile My Ardrone lib for Windows if you want. (under Debian: apt-get install mingw32)) 
else 
# @$(MAKE) PC_TARGET=yes TARGET=mingw32_ USE_MINGW32=yes TMP_SDK_FLAGS="USE_MINGW32=yes NO_COM=yes USE_BLUEZ=no" -C ../Lib/Build $(MAKECMDGOALS) 
# @$(MAKE) PC_TARGET=yes TARGET=emb_mingw32_ USE_MINGW32=yes CONTROL_DLL=yes TMP_SDK_FLAGS="USE_MINGW32=yes NO_COM=yes USE_BLUEZ=no" -C ../Lib/Build $(MAKECMDGOALS) 
endif 
endif 
ifeq ($(WIIMOTE_SUPPORT),yes) 
# @$(MAKE) PC_TARGET=yes TARGET=pc_ TMP_SDK_FLAGS="USE_BLUEZ=yes" -C ../Lib/libcwiid $(MAKECMDGOALS) 
endif 

define svn_update_template 
    cd ../.. ; \ 
    echo "Checking out tag $(1) of $(2) ..." ; \ 
    if [ $(1) != head ] ; then \ 
     svn co -r $(1) https://svn.ardrone.org/repo/ARDrone_API/$(2) ; \ 
    else \ 
     svn co https://svn.ardrone.org/repo/ARDrone_API/$(2) ; \ 
    fi ; \ 
    cd Soft/Build ; 
endef 

svn_update: 
    @-$(call svn_update_template,$(SDK_VERSION),ARDroneLib) 

如果custom.makefile和config.makefile需要,你可以在這裏找到它們:http://pastebin.com/H8PNKKhu

UPDATE 2:我剛剛發現這個,位於$(SDK_PATH)/VP_SDK/Buildhttp://pastebin.com/3knnSkmy

+1

這將有助於你向我們展示了在'$(SDK_PATH)makefile文件/柔和/ Build'。 – Beta 2012-08-05 20:33:18

+0

感謝您的回覆,將該文件添加到我的文章。 – laobeylu 2012-08-06 08:29:43

+0

這是一些免費軟件(或開源)嗎?如果是這樣,你可以將我們鏈接到項目中,以便我們可以在源代碼樹中搜索嗎? – 2012-08-06 23:00:06

回答

0

我做到了。最後!!!

解決方案:在$(SDK_PATH)/VP_SDK/Build中有一個名爲generic.makefile的文件,其中包含所有編譯器和鏈接器調用。我必須將-shared-fPIC參數添加到其中一些參數中。聽起來很簡單,但沒有那是記錄,所以我首先要尋找那些隱藏的編譯器/連接調用...

1

既然你沒有向我們展示makefile $(SDK_PATH)/Soft/Build,我要猜測。

在GNU進行手動,還有的variables used by implicit rules名單:

  • CFLAGS:額外的標誌給C編譯器。
  • LDFLAGS:額外的標誌賦予編譯器,當他們應該調用鏈接'ld'。

此外,catalogue of implicit rules還提到了LDLIBS變量,該變量用於隱式鏈接規則中使用的庫。 (隱式鏈接規則是罰款時,你必須被連接的單源文件或者對象的一個​​文件是最終的可執行文件的名稱,否則,你需要寫一個明確的關聯規則。)

+0

謝謝你的回覆。我已經將其他makefile添加到我的帖子中。你能舉個例子說明我可以寫出這樣一個明確的規則嗎?這可能是很簡單,但我是一個總的小白,當談到makefile文件... – laobeylu 2012-08-06 08:34:06

1

這不是成爲焦點。這些似乎是生成的makefile,所以他們苦苦追尋的,還有的顯然更事情比我們所看到的(我不怪你不張貼的一切),我沒有看到,其中build_libs規則線索,或任何使用鏈接器,或什麼可以建立一個靜態庫。我們可以告訴你如何寫一個明確的規則,以構建一個共享庫,但沒有來源或對象列表,我們就不知道該怎麼放入該庫中。

這是越來越絕望,但你可以嘗試以下方法:

1)make -C $(SDK_PATH)/Soft/Build(將在適當的值$(SDK_PATH)),並驗證這將產生靜態庫。

2)make -n,捕獲輸出的洪流並將其放入pastebin。我們將嘗試查看它正在使用的規則,這可能會導致我們需要的規則。

+0

使-n的輸出甚至超過了從引擎收錄了500KB的限制。我不得不把它放在這裏:http://tinypaste.com/5ab0ec82。我也應該注意到make -n失敗,說沒有規則來製作目標ardrone_tetsing_tool,並且使(不帶-n選項)成功(???)。 – laobeylu 2012-08-06 12:54:13

+0

'make -C $(SDK_PATH)/ Soft/Build'失敗,留下一個完整的.o和.d文件的目錄。但在運行第一生成文件我張貼導致生成文件在$(SDK_PATH)/柔和/編譯生成兩個靜態庫,libpc_ardrone.a和libpc_ardrone_notool.a。我將嘗試爲'make -C $(SDK_PATH)/ Soft/Build'添加一些參數以取得成功。 – laobeylu 2012-08-06 12:59:03

+0

我剛剛發現了一個文件(位於$(SDK_PATH)/ VP_SDK /編譯),似乎包含所有這些編譯器和鏈接器調用,在其他文件不存在:http://pastebin.com/3knnSkmy – laobeylu 2012-08-06 17:25:27