c - 构建 C 库时遇到问题(使用 makefile)

标签 c java-native-interface makefile ld

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

最佳答案

autoConf.bash 可能无法执行。使用 su 运行不会有帮助。尝试:

# chmod a+x autoConf.bash

关于c - 构建 C 库时遇到问题(使用 makefile),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11807680/

相关文章:

c - 在同一行而不是新行上更新 printf 值

c - K&R 练习 1-8。我可以让我的代码正常工作

c - 释放后将变量设置为 NULL

android ANativeWindow_lock api 不适用于 GLSurfaceView

c++ - Qt 项目的通用 Makefile

c - 这个双重声明在 C 中是什么意思?

java - 将输入字符串转换为十六进制数表示

java - Android Studio 中带有实验性 Gradle 插件的 native 预构建共享库

c++ - 编译目录中的所有源文件并将objs存储在不同的目录中

c++ - 如何创建仅包含主文件和模板 header 的 makefile (C++)