2012-08-05 638 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