0

私はmakefilesにとても慣れていません。GNU-makeのマニュアルを読んでいますが、暗黙のルールで実行される場合のコンパイラとリンカのパラメータの設定方法がまだわかりません。これはmakefileの一部です。すべてをコンパイルしてリンクする方法について、明示的な宣言がないことに注意してください。

.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ますldCFLAGS=-fPICとを試してみましたがLDFLAGS=-shared -soname foo、うまくいきませんでした。共有ライブラリを取得する方法について誰か提案がありますか?さらに詳しい情報が必要な場合は、お問い合わせください。前もって感謝します!

更新: $(SDK_PATH)/ Soft / Buildのmakefile:

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_" > $@
    @echo "#define _GENERATED_CUSTOM_CONFIGURATION_H_" >> $@
    @echo >> $@
    @echo "#if  defined(BR2_PACKAGE_BCM4318_AP)" >> $@
    @echo "#  define AP" >> $@
    @echo "#else" >> $@
    @echo "#  define STA" >> $@
    @echo "#endif" >> $@
    @echo "#define CURRENT_NUM_VERSION_SOFT \"$(MAJOR_VERSION).$(MINOR_VERSION).$(MODIF_VERSION)\"" >> $@
    @echo "#define CURRENT_BUILD_DATE \"$(shell date +%F\ %H:%M)\"" >> $@
    @echo >> $@
ifeq ("$(VIDEO_YUV)","yes")
    @echo "#define USE_VIDEO_YUV" >> $@
endif
ifeq ("$(RECORD_VISION_DATA)","yes")
    @echo "#define RECORD_VISION_DATA" >> $@
endif
    @echo >> $@
    @echo "#define WIFI_NETWORK_NAME \"$(WIFI_NETWORK_NAME)\"" >> $@
    @echo "#define WIFI_BROADCAST \"$(WIFI_BROADCAST)\"" >> $@
    @echo "#define WIFI_ARDRONE_IP \"$(WIFI_ARDRONE_IP)\"" >> $@
    @echo >> $@
    @echo "#if defined(__linux__) || defined(USE_MINGW32)" >> $@
    @echo "# define WIFI_MOBILE_IP \"$(WIFI_MOBILE_IP)\"" >> $@
    @echo "# define WIRED_ITFNAME \"$(WIRED_ITFNAME)\"" >> $@
    @echo "#endif // ! __linux__" >> $@
    @echo >> $@
    @echo >> $@
    @echo "#endif // ! _GENERATED_CUSTOM_CONFIGURATION_H_" >> $@

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

更新2:私はこれを発見しました:http $(SDK_PATH)/VP_SDK/Build//pastebin.com/3knnSkmy

4

3 に答える 3

1

でmakefileを表示していないので$(SDK_PATH)/Soft/Build、推測します。

GNU Makeマニュアルには、暗黙のルールで使用される変数のリストがあります。

  • CFLAGS:Cコンパイラに与える追加のフラグ。
  • LDFLAGS:リンカー'ld'を呼び出すことになっているときにコンパイラーに与える追加のフラグ。

さらに、暗黙のルールのカタログにLDLIBSは、暗黙のリンクルールで使用されるライブラリに名前を付ける変数が記載されています。(リンクされている単一のソースファイルがある場合、またはオブジェクトファイルの1つが最終的な実行可能ファイルの名前である場合、暗黙的なリンクルールは問題ありません。それ以外の場合は、明示的なリンクルールを作成する必要があります。)

于 2012-08-05T21:18:16.600 に答える
1

これは焦点になりません。build_libsこれらは生成されたmakefileのように見えるので、追跡するのは難しく、私たちが見ているよりも明らかに多くのことが起こっています(そして、すべてを投稿しなかったことであなたを責めません)、そしてルールがどこにつながるのかわかりません、またはリンカーの使用、または静的ライブラリを構築できるものなら何でも。共有ライブラリを構築するための明示的なルールを作成する方法を示すことはできますが、ソースまたはオブジェクトのリストがないと、そのライブラリに何を入れるかわかりません。

これは必死になっていますが、次のことを試してみてください。

1)make -C $(SDK_PATH)/Soft/Build($(SDK_PATH)に適切な値を入力)、これにより静的ライブラリが生成されることを確認します。

2)make -n、出力の急流をキャプチャし、ペーストビンに入れます。使用しているルールを確認します。これにより、必要なルールが作成される可能性があります。

于 2012-08-06T11:46:43.303 に答える
0

やったよ。ついに!!!

解決策:すべてのコンパイラーとリンカーの呼び出しを含む$(SDK_PATH)/VP_SDK/Buildという名前のファイルがありました。それらのいくつかにと引数generic.makefileを追加する必要がありました。本当に単純に聞こえますが、それについては何も文書化されていないので、最初にその隠されたコンパイラ/リンカーの呼び出しを探す必要がありました...-shared-fPIC

于 2012-08-09T18:43:15.680 に答える