2012-08-04 62 views
0

我在做一個需要連接到AR.Drone 2.0的項目。我有一個Java中的功能GUI,但要控制無人機,我必須使用它的C庫SDK。我編寫了通過JNI組合Java和C的必要功能,但由於我對SDK提供的示例做了修改,因此不再構建它。它被認爲是用makefile(我也嘗試改變而沒有成功)運行make命令來構建的。問題是我對C和makefile很陌生,而且我在網上搜索了很多,但沒有找到任何解決方案。因此,這裏是圖書館的模樣:構建C庫(使用makefile)的問題

.: Folder root 
| 
+ src: Sources 
| 
+ ARDroneLib: The AR.Drone Library 
| | 
| + Soft: Containing the "interesting" part of the whole lib 
| | | 
| | + More subdirs... (Build: contains a makefile, Common: c and h files, Lib: stuff) 
| | 
| + Many other subdirectories (FFMPEG, ITTIAM, VLIB, VP_SDK) 
| 
+ DroneControl: My own code 
    | 
    + Source:The source files 
    | | 
    | + Navdata: Code to retrieve the navigation data 
    | | | 
    | | + navdata.c 
    | | + navdata.h 
    | | 
    | + Video: Code to retrieve the drone's video stream 
    | | | 
    | | + video_stage.c 
    | | + video_stage.h 
    | | 
    | + ardrone_testing_tool.c: Main file, containing the main function, etc. 
    | + ardrone_testing_tool.h: Its header 
    | + dronecontrol_ARDrone: My own file, containing JNI methods (also has an init() function which calls main() in ardrone_testing_tool.c) 
    | + dronecontrol_ARDrone: Its header 
    | + vars.h:  Some shared variables 
    | 
    + Build:Contains the makefile 
     | 
     + makefile: The makefile 

下面是./src/DroneControl/Build/生成文件:

SDK_PATH:=$(shell pwd)/../../ARDroneLib 
PC_TARGET=yes 
USE_LINUX=yes 
ifdef MYKONOS 
include $(ARDRONE_CUSTOM_CONFIG) 
include $(ARDRONE_BUILD_CONFIG) 
else 
include $(SDK_PATH)/Soft/Build/custom.makefile 
include $(SDK_PATH)/Soft/Build/config.makefile 
endif 
ifeq "$(RELEASE_BUILD)" "yes" 
ARDRONE_TARGET_DIR=$(shell pwd)/../../../ 
else 
ARDRONE_TARGET_DIR=$(shell pwd)/../../../Debug 
endif 
TARGET=linux_sdk_demo 
SRC_DIR:=$(shell pwd)/../Sources 
# Define application source files 
GENERIC_BINARIES_SOURCE_DIR:=$(SRC_DIR) 
GENERIC_BINARIES_COMMON_SOURCE_FILES+= \ 
Navdata/navdata.c \ 
Video/video_stage.c 
GENERIC_INCLUDES+=  \ 
$(SRC_DIR) \ 
$(LIB_DIR) \ 
$(SDK_PATH)/Soft/Common \ 
$(SDK_PATH)/Soft/Lib 
GENERIC_TARGET_BINARIES_PREFIX= 
GENERIC_TARGET_BINARIES_DIR=$(ARDRONE_TARGET_DIR) 
GENERIC_BINARIES_SOURCE_ENTRYPOINTS+= \ 
ardrone_testing_tool.c 
GENERIC_INCLUDES:=$(addprefix -I,$(GENERIC_INCLUDES)) 
GENERIC_LIB_PATHS=-L$(GENERIC_TARGET_BINARIES_DIR) 
GENERIC_LIBS=-lpc_ardrone -lgtk-x11-2.0 -lrt 
SDK_FLAGS+="USE_APP=yes" 
SDK_FLAGS+="APP_ID=linux_sdk_demo" 
export GENERIC_CFLAGS 
export GENERIC_LIBS 
export GENERIC_LIB_PATHS 
export GENERIC_INCLUDES 
export GENERIC_BINARIES_SOURCE_DIR 
export GENERIC_BINARIES_COMMON_SOURCE_FILES 
export GENERIC_TARGET_BINARIES_PREFIX 
export GENERIC_TARGET_BINARIES_DIR 
export GENERIC_BINARIES_SOURCE_ENTRYPOINTS 
export GENERIC_LIBRARY_SOURCE_DIR=$(GENERIC_BINARIES_SOURCE_DIR) 

.PHONY: $(TARGET) build_libs 
all: build_libs $(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)/ 
$(MAKECMDGOALS): build_libs 
@$(MAKE) -C $(SDK_PATH)/VP_SDK/Build $(TMP_SDK_FLAGS) $(SDK_FLAGS) $(MAKECMDGOALS) USE_LINUX=yes 
build_libs: 
@$(MAKE) -C $(SDK_PATH)/Soft/Build $(TMP_SDK_FLAGS) $(SDK_FLAGS) $(MAKECMDGOALS) USE_LINUX=yes 

但是當我試圖讓這一點,make命令給了我下面的錯誤:

Libs already extracted 
Building target static 
/bin/sh: 1: ./autoConf.bash: Permission denied 
make[2]: *** [build] Error 126 
Checking required Ubuntu packages ... 
ok. 
Building ARDroneTool/Lib 
Building ARDroneTool/Lib 
ld ardrone_testing_tool 
/usr/bin/ld: cannot find -lswscale 
/usr/bin/ld: cannot find -lavformat 
/usr/bin/ld: cannot find -lavcodec 
/usr/bin/ld: cannot find -lavutil 
collect2: ld returned 1 exit status 
make[3]: *** [/home/user/workspace/AutoFlight/lib/native/DroneControl/src/DroneControl/Build/../../..//ardrone_testing_tool] Error 1 
make[2]: *** [all] Error 2 
make[1]: *** [build_app] Error 2 
make: *** [linux_sdk_demo] Error 2 

我還沒有弄清楚什麼-lwscale,-lavformat等等。我也嘗試了make命令作爲su(主要是因爲「Permission denied」錯誤),並且希望這是提出這個問題的正確地方。 那麼有沒有人有如何將這個編譯成動態鏈接庫(.so文件)的建議?任何幫助將不勝感激!

更新1:Permission denied錯誤,現在解決(感謝@eyalm)

更新2:它現在。我已經重寫了makefile,但我不知道現在有什麼不同,可能會影響ld的路徑。

+0

什麼是autoConf.bash的權限,即'ls -l autoConf.bash'顯示什麼? – Mark 2012-08-04 10:05:23

+0

@Mark ls顯示:'-rw-rw-r-- 1個用戶用戶10474 Mar 21 15:50'。 – laobeylu 2012-08-04 10:25:53

+0

'-lswscale'等缺少格式爲'libswscale.so'或'libswscale.a'的庫,鏈接器正在尋找與您的應用程序鏈接的庫。請檢查您在構建中添加這些庫的位置,以及這些庫是否作爲項目的一部分存在(「find -iname」* swscale *「-type f'或其他) – 2012-08-04 18:19:15

回答

1

autoConf.bash可能不可執行。用su運行將無濟於事。嘗試:

# chmod a+x autoConf.bash 
+0

謝謝,權限被拒絕錯誤已解決。但是'ld'仍然會給出相同的錯誤。 – laobeylu 2012-08-04 10:30:44

0
> /usr/bin/ld: cannot find -lswscale 
> /usr/bin/ld: cannot find -lavformat 
> /usr/bin/ld: cannot find -lavcodec 
> /usr/bin/ld: cannot find -lavutil 
> collect2: ld returned 1 exit status 

這可能是因爲這些依賴關係(即libswscalelibavformatlibavcodec, 和libavutil)或是不存在你的系統上,或存在 在不是的一部分目錄ld的標準搜索路徑。

如果依賴關係不存在,那麼您需要安裝它們。在Debian派生的系統上,您可以使用apt-file命令來查找您需要安裝的軟件包。例如:

% apt-file -l find libswscale.a 
libswscale-dev 
% apt-file -l find libavutil.a 
libavutil-dev 
...etc... 

如果這些庫已經存在你的系統上,但在非標準位置, 你可以使用LD-L選項相關的目錄添加到其搜索路徑。例如:

% ld ..other-options... -L SEARCHDIR1 -L SEARCHDIR2 ... -lswscale -lavutil ...etc... 

注意,-L SEARCHDIR選項需要出現之前-l LIB選項。

+0

不知何故,它今天神奇地工作。我不知道爲什麼。 '找不到-l ...'錯誤消失了(我沒有真正做任何事情,也沒有將這些庫添加到路徑中...)。不管怎麼說,還是要謝謝你! – laobeylu 2012-08-05 09:16:58