Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安卓NDK链接;“未定义引用”;当链接到静态库时 环境 android-ndk-r10c 视觉GDB Windows x64 用例1 ADB-CMDLIN可执行文件(没有java /APK)由几个C++文件组成 编译的可执行文件在Application.mk处具有“APP_STL:=gnustl_static” 可执行文件已成功编译并运行 用例2 用例1的ADB工具分为两个独立的项目 封装通用功能的静态库 ADB工具减去迁移到静态库的功能 编译可执行和静态库时,在Application.mk处有“APP_STL:=gnustl_static” 编译ADB Exe时具有本地\u LDLIBS:=-L$(路径\u到\u静态\u LIB)-lstaticlib 编译失败,链接器错误为“未定义对`std::terminate()'的引用” 手头的问题_Android_Makefile_Android Ndk - Fatal编程技术网

安卓NDK链接;“未定义引用”;当链接到静态库时 环境 android-ndk-r10c 视觉GDB Windows x64 用例1 ADB-CMDLIN可执行文件(没有java /APK)由几个C++文件组成 编译的可执行文件在Application.mk处具有“APP_STL:=gnustl_static” 可执行文件已成功编译并运行 用例2 用例1的ADB工具分为两个独立的项目 封装通用功能的静态库 ADB工具减去迁移到静态库的功能 编译可执行和静态库时,在Application.mk处有“APP_STL:=gnustl_static” 编译ADB Exe时具有本地\u LDLIBS:=-L$(路径\u到\u静态\u LIB)-lstaticlib 编译失败,链接器错误为“未定义对`std::terminate()'的引用” 手头的问题

安卓NDK链接;“未定义引用”;当链接到静态库时 环境 android-ndk-r10c 视觉GDB Windows x64 用例1 ADB-CMDLIN可执行文件(没有java /APK)由几个C++文件组成 编译的可执行文件在Application.mk处具有“APP_STL:=gnustl_static” 可执行文件已成功编译并运行 用例2 用例1的ADB工具分为两个独立的项目 封装通用功能的静态库 ADB工具减去迁移到静态库的功能 编译可执行和静态库时,在Application.mk处有“APP_STL:=gnustl_static” 编译ADB Exe时具有本地\u LDLIBS:=-L$(路径\u到\u静态\u LIB)-lstaticlib 编译失败,链接器错误为“未定义对`std::terminate()'的引用” 手头的问题,android,makefile,android-ndk,Android,Makefile,Android Ndk,将所有CPP文件编译为一个项目时,一切正常,没有链接器错误。 当将逻辑放入精简可执行文件和staticlib(可执行文件链接的对象)时,我得到一个“未定义对`std::terminate()'的引用”链接器错误 在我看来,虽然指定了“APP_STL:=gnustl_static”,但“gnustl_static”似乎没有与可执行文件链接 我错过了什么?有没有办法强制“gnustl_static”链接 制作文件以供参考: Makefile,其中所有文件都是同一可执行文件的一部分(工作) Appli

将所有CPP文件编译为一个项目时,一切正常,没有链接器错误。
当将逻辑放入精简可执行文件和staticlib(可执行文件链接的对象)时,我得到一个“未定义对`std::terminate()'的引用”链接器错误

在我看来,虽然指定了“APP_STL:=gnustl_static”,但“gnustl_static”似乎没有与可执行文件链接

我错过了什么?有没有办法强制“gnustl_static”链接

制作文件以供参考: Makefile,其中所有文件都是同一可执行文件的一部分(工作)

Application.mk

APP_STL := gnustl_static
APP_ABI := all
APP_CFLAGS := -std=gnu++11
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.9
APP_STL := gnustl_static
APP_ABI := all
APP_CFLAGS := -std=gnu++11
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.9
APP_STL := gnustl_static
APP_ABI := all
APP_CFLAGS := -std=gnu++11
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.9
APP_MODULES := Collections-static Collections-shared
Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ScreenCapSvc
LOCAL_SRC_FILES := ScreenCapSvc.cpp SnapshotController.cpp SimpleTCPStream.cpp SocketsServer.cpp uuids.cpp
LOCAL_C_INCLUDES := 
LOCAL_STATIC_LIBRARIES := 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS := -llog
LOCAL_CFLAGS := 
LOCAL_CPPFLAGS := 
LOCAL_LDFLAGS := 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ScreenCapSvc
LOCAL_SRC_FILES := ScreenCapSvc.cpp SnapshotController.cpp
LOCAL_C_INCLUDES := 
LOCAL_STATIC_LIBRARIES := 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS := -llog -L$(PATH_TO_STATIC_LIB) -lCollections_statis
LOCAL_CFLAGS := 
LOCAL_CPPFLAGS := 
LOCAL_LDFLAGS := 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections-shared
LOCAL_SRC_FILES := SimpleTCPStream.cpp SocketsServer.cpp uuids.cpp
LOCAL_C_INCLUDES :=
LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES :=
LOCAL_LDLIBS := -llog
LOCAL_CFLAGS :=
LOCAL_CPPFLAGS :=
LOCAL_LDFLAGS :=
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections-static
LOCAL_SRC_FILES :=  $(COMMON_SRC_FILES)
include $(BUILD_STATIC_LIBRARY)
LOCAL_LDLIBS += -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/$(TARGET_ARCH_ABI) -lgnustl_static
生成文件,其中文件被拆分为静态库和链接到库的可执行文件 (不工作)

可执行应用程序.mk

APP_STL := gnustl_static
APP_ABI := all
APP_CFLAGS := -std=gnu++11
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.9
APP_STL := gnustl_static
APP_ABI := all
APP_CFLAGS := -std=gnu++11
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.9
APP_STL := gnustl_static
APP_ABI := all
APP_CFLAGS := -std=gnu++11
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.9
APP_MODULES := Collections-static Collections-shared
可执行Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ScreenCapSvc
LOCAL_SRC_FILES := ScreenCapSvc.cpp SnapshotController.cpp SimpleTCPStream.cpp SocketsServer.cpp uuids.cpp
LOCAL_C_INCLUDES := 
LOCAL_STATIC_LIBRARIES := 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS := -llog
LOCAL_CFLAGS := 
LOCAL_CPPFLAGS := 
LOCAL_LDFLAGS := 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ScreenCapSvc
LOCAL_SRC_FILES := ScreenCapSvc.cpp SnapshotController.cpp
LOCAL_C_INCLUDES := 
LOCAL_STATIC_LIBRARIES := 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS := -llog -L$(PATH_TO_STATIC_LIB) -lCollections_statis
LOCAL_CFLAGS := 
LOCAL_CPPFLAGS := 
LOCAL_LDFLAGS := 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections-shared
LOCAL_SRC_FILES := SimpleTCPStream.cpp SocketsServer.cpp uuids.cpp
LOCAL_C_INCLUDES :=
LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES :=
LOCAL_LDLIBS := -llog
LOCAL_CFLAGS :=
LOCAL_CPPFLAGS :=
LOCAL_LDFLAGS :=
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections-static
LOCAL_SRC_FILES :=  $(COMMON_SRC_FILES)
include $(BUILD_STATIC_LIBRARY)
LOCAL_LDLIBS += -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/$(TARGET_ARCH_ABI) -lgnustl_static
静态Lib Application.mk

APP_STL := gnustl_static
APP_ABI := all
APP_CFLAGS := -std=gnu++11
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.9
APP_STL := gnustl_static
APP_ABI := all
APP_CFLAGS := -std=gnu++11
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.9
APP_STL := gnustl_static
APP_ABI := all
APP_CFLAGS := -std=gnu++11
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.9
APP_MODULES := Collections-static Collections-shared
静态库Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ScreenCapSvc
LOCAL_SRC_FILES := ScreenCapSvc.cpp SnapshotController.cpp SimpleTCPStream.cpp SocketsServer.cpp uuids.cpp
LOCAL_C_INCLUDES := 
LOCAL_STATIC_LIBRARIES := 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS := -llog
LOCAL_CFLAGS := 
LOCAL_CPPFLAGS := 
LOCAL_LDFLAGS := 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ScreenCapSvc
LOCAL_SRC_FILES := ScreenCapSvc.cpp SnapshotController.cpp
LOCAL_C_INCLUDES := 
LOCAL_STATIC_LIBRARIES := 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS := -llog -L$(PATH_TO_STATIC_LIB) -lCollections_statis
LOCAL_CFLAGS := 
LOCAL_CPPFLAGS := 
LOCAL_LDFLAGS := 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections-shared
LOCAL_SRC_FILES := SimpleTCPStream.cpp SocketsServer.cpp uuids.cpp
LOCAL_C_INCLUDES :=
LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES :=
LOCAL_LDLIBS := -llog
LOCAL_CFLAGS :=
LOCAL_CPPFLAGS :=
LOCAL_LDFLAGS :=
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections-static
LOCAL_SRC_FILES :=  $(COMMON_SRC_FILES)
include $(BUILD_STATIC_LIBRARY)
LOCAL_LDLIBS += -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/$(TARGET_ARCH_ABI) -lgnustl_static

事实上,虽然在可执行文件的Application.mk中严格指定了“APP_STL:=gnustl_static”,但它并没有真正链接,为了强制gnustl_static链接,我在Android.mk的本地_ldlib中添加了以下内容

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ScreenCapSvc
LOCAL_SRC_FILES := ScreenCapSvc.cpp SnapshotController.cpp SimpleTCPStream.cpp SocketsServer.cpp uuids.cpp
LOCAL_C_INCLUDES := 
LOCAL_STATIC_LIBRARIES := 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS := -llog
LOCAL_CFLAGS := 
LOCAL_CPPFLAGS := 
LOCAL_LDFLAGS := 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ScreenCapSvc
LOCAL_SRC_FILES := ScreenCapSvc.cpp SnapshotController.cpp
LOCAL_C_INCLUDES := 
LOCAL_STATIC_LIBRARIES := 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS := -llog -L$(PATH_TO_STATIC_LIB) -lCollections_statis
LOCAL_CFLAGS := 
LOCAL_CPPFLAGS := 
LOCAL_LDFLAGS := 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections-shared
LOCAL_SRC_FILES := SimpleTCPStream.cpp SocketsServer.cpp uuids.cpp
LOCAL_C_INCLUDES :=
LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES :=
LOCAL_LDLIBS := -llog
LOCAL_CFLAGS :=
LOCAL_CPPFLAGS :=
LOCAL_LDFLAGS :=
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections-static
LOCAL_SRC_FILES :=  $(COMMON_SRC_FILES)
include $(BUILD_STATIC_LIBRARY)
LOCAL_LDLIBS += -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/$(TARGET_ARCH_ABI) -lgnustl_static

在我看来,这就像NDK构建系统中的一个bug…

看起来确实,尽管在可执行文件的Application.mk中严格指定了“APP\u STL:=gnustl\u static”,但它并没有真正链接,为了强制gnustl\u static链接,我在Android.mk的LOCAL\u ldlib中添加了以下内容

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ScreenCapSvc
LOCAL_SRC_FILES := ScreenCapSvc.cpp SnapshotController.cpp SimpleTCPStream.cpp SocketsServer.cpp uuids.cpp
LOCAL_C_INCLUDES := 
LOCAL_STATIC_LIBRARIES := 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS := -llog
LOCAL_CFLAGS := 
LOCAL_CPPFLAGS := 
LOCAL_LDFLAGS := 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := ScreenCapSvc
LOCAL_SRC_FILES := ScreenCapSvc.cpp SnapshotController.cpp
LOCAL_C_INCLUDES := 
LOCAL_STATIC_LIBRARIES := 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS := -llog -L$(PATH_TO_STATIC_LIB) -lCollections_statis
LOCAL_CFLAGS := 
LOCAL_CPPFLAGS := 
LOCAL_LDFLAGS := 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections-shared
LOCAL_SRC_FILES := SimpleTCPStream.cpp SocketsServer.cpp uuids.cpp
LOCAL_C_INCLUDES :=
LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES :=
LOCAL_LDLIBS := -llog
LOCAL_CFLAGS :=
LOCAL_CPPFLAGS :=
LOCAL_LDFLAGS :=
COMMON_SRC_FILES := $(LOCAL_SRC_FILES)
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections-static
LOCAL_SRC_FILES :=  $(COMMON_SRC_FILES)
include $(BUILD_STATIC_LIBRARY)
LOCAL_LDLIBS += -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/$(TARGET_ARCH_ABI) -lgnustl_static

在我看来,这似乎是NDK构建系统中的一个bug…

这不是NDK构建系统中的bug,但这是如何使用它的问题

如果您运行
ndk build V=1
,您会看到它尝试执行的实际命令,您会看到它已经尝试在gnustl_static中链接,但它在链接到您自己的静态库之前先将其链接。链接器仅按链接器命令行上指定的顺序尝试库,这意味着它不会尝试使用先前指定的gnustl_静态库来解析来自后续库的未定义引用

这里正确的解决方案是不使用
LOCAL\u LDLIBS
强制链接到静态库,而是使用NDK提供的基础设施链接到静态库。也就是说,更改可执行文件Android.mk如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE           := ScreenCapSvc
LOCAL_SRC_FILES        := ScreenCapSvc.cpp SnapshotController.cpp
LOCAL_STATIC_LIBRARIES := Collections_static
LOCAL_LDLIBS           := -llog
include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections_static
LOCAL_SRC_FILES := $(PATH_TO_STATIC_LIB)/libCollections_static.a
include $(PREBUILT_STATIC_LIBRARY)
这样,无论静态库是作为同一构建的一部分构建的,还是作为预构建库构建的,都可以以相同的方式将静态库包含到可执行文件的构建中


此语法还允许您在静态库的节中添加
LOCAL\u EXPORT\u C\u INCLUDES
,以便在构建可执行文件时添加正确的包含路径,而无需手动将其添加到可执行文件的节中。

这不是NDK构建系统中的错误,但这是如何使用它的问题

如果您运行
ndk build V=1
,您会看到它尝试执行的实际命令,您会看到它已经尝试在gnustl_static中链接,但它在链接到您自己的静态库之前先将其链接。链接器仅按链接器命令行上指定的顺序尝试库,这意味着它不会尝试使用先前指定的gnustl_静态库来解析来自后续库的未定义引用

这里正确的解决方案是不使用
LOCAL\u LDLIBS
强制链接到静态库,而是使用NDK提供的基础设施链接到静态库。也就是说,更改可执行文件Android.mk如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE           := ScreenCapSvc
LOCAL_SRC_FILES        := ScreenCapSvc.cpp SnapshotController.cpp
LOCAL_STATIC_LIBRARIES := Collections_static
LOCAL_LDLIBS           := -llog
include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)
LOCAL_MODULE    := Collections_static
LOCAL_SRC_FILES := $(PATH_TO_STATIC_LIB)/libCollections_static.a
include $(PREBUILT_STATIC_LIBRARY)
这样,无论静态库是作为同一构建的一部分构建的,还是作为预构建库构建的,都可以以相同的方式将静态库包含到可执行文件的构建中

此语法还允许您在静态库的节中添加
LOCAL\u EXPORT\u C\u INCLUDES
,以便在构建可执行文件时添加正确的包含路径,而无需手动将其添加到可执行文件的节中