我對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=-fPIC
和LDFLAGS=-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/Build
:http://pastebin.com/3knnSkmy
這將有助於你向我們展示了在'$(SDK_PATH)makefile文件/柔和/ Build'。 – Beta 2012-08-05 20:33:18
感謝您的回覆,將該文件添加到我的文章。 – laobeylu 2012-08-06 08:29:43
這是一些免費軟件(或開源)嗎?如果是這樣,你可以將我們鏈接到項目中,以便我們可以在源代碼樹中搜索嗎? – 2012-08-06 23:00:06