无法构建C库(使用makefile)

时间:2012-08-04 10:03:46

标签: c java-native-interface makefile ld

我正在做一个我需要连接到AR.Drone 2.0的项目。我在Java中有一个功能GUI,但是为了控制无人机,我必须使用它的SDK,这是一个C库。我编写了必要的函数来通过JNI组合Java和C,但是由于我对SDK提供的示例所做的修改,它不再构建。它被认为是使用make命令构建的(我也尝试过更改但没有成功)。问题是我对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 /:

中的makefile
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(主要是因为“权限被拒绝”错误),并希望这是问这个的正确位置。 那么有没有人建议如何将其编译成动态链接库(.so文件)?任何帮助将非常感谢!

更新1:许可被拒绝错误现已解决(感谢@eyalm)

更新2:现在有效。我已经重写了makefile,但我不知道现在有什么不同可能会影响ld的路径。

2 个答案:

答案 0 :(得分:1)

autoConf.bash可能不可执行。用su运行无济于事。尝试:

# chmod a+x autoConf.bash

答案 1 :(得分: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选项之前显示