Android makefile 链接两次
Android makefile links twice
我已经在 SDL 中为我的游戏设置了一个生成文件。SDL 中包含的 Application.mk 文件的模板具有三种体系结构:
APP_ABI := armeabi armeabi-v7a x86
对于armeabi
来说,一切都编译得很好,但对于armeabi-v7a
来说,它失败了。对我来说,看起来编译完成,但链接器两次拥有两个特定文件夹的所有obj
文件。虽然这不会发生在armeabi
.链接器(ld
(给了我这样的错误:
/path/to/bin/ld: error: /path/to/myObjFile.obj: multiple definition of 'foo(int, int)'
/path/to/bin/ld: /path/to/myObjFile.obj: previous definition here
路径完全相同,因此这让我假设链接器使用每个文件两次。此处是此类错误的完整示例:
/Users/martijncourteaux/Development/android-ndk-r10c/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: error: /Volumes/Stuff/Projects/GameDev/Gump/GumpAndroid/obj/local/armeabi-v7a/objs/main//Volumes/Stuff/Projects/GameDev/Gump/GumpAndroid/jni/src/__/ThirdParty/Box2D/Collision/b2Distance.o: multiple definition of 'b2Distance(b2DistanceOutput*, b2SimplexCache*, b2DistanceInput const*)'
/Users/martijncourteaux/Development/android-ndk-r10c/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: /Volumes/Stuff/Projects/GameDev/Gump/GumpAndroid/obj/local/armeabi-v7a/objs/main//Volumes/Stuff/Projects/GameDev/Gump/GumpAndroid/jni/src/__/ThirdParty/Box2D/Collision/b2Distance.o: previous definition here
但是,当我启动 ndk-build
时,链接双精度的对象文件也会生成此警告:
/Users/martijncourteaux/Development/android-ndk-r10c/build/core/build-binary.mk:449: warning: ignoring old commands for target `/Volumes/Stuff/Projects/GameDev/Gump/GumpAndroid/obj/local/armeabi-v7a/objs/main//Volumes/Stuff/Projects/GameDev/Gump/GumpAndroid/jni/src/__/ThirdParty/Collision/b2Distance.o'
/Users/martijncourteaux/Development/android-ndk-r10c/build/core/build-binary.mk:449: warning: overriding commands for target `/Volumes/Stuff/Projects/GameDev/Gump/GumpAndroid/obj/local/armeabi-v7a/objs/main//Volumes/Stuff/Projects/GameDev/Gump/GumpAndroid/jni/src/__/ThirdParty/Collision/b2Distance.o'
请注意,我的印象是,所有这些obj
具有这些multiple definition
错误生成的文件也会生成此警告。
这是我的Application.mk
:
APP_STL := gnustl_static
APP_ABI := armeabi armeabi-v7a x86
NDK_TOOLCHAIN_VERSION := clang
APP_CPPFLAGS += -std=c++11
APP_PLATFORM := android-10
这是我的Android.mk
:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
SDL_PATH := ../SDL
THIRD_PARTY_FOLDER := $(LOCAL_PATH)/../ThirdParty
LOCAL_CPPFLAGS += -frtti
LOCAL_CPPFLAGS += -fexceptions
LOCAL_CPPFLAGS += -funwind-tables
PCH_FILE := $(LOCAL_PATH)/Gump/Gump-Prefix.pch
#PCH_FILE := Gump/Gump-Prefix.pch
LOCAL_CPPFLAGS += -include $(PCH_FILE)
#LOCAL_PCH := $(PCH_FILE)
#LOCAL_CPPFLAGS += -DPCH
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include
$(LOCAL_PATH)/$(SDL_PATH)_mixer/
$(LOCAL_PATH)/$(SDL_PATH)_image/
$(LOCAL_PATH)/$(SDL_PATH)_net/
$(LOCAL_PATH)/../ThirdParty/
$(LOCAL_PATH)/Gump/
# Add your application source files here...
GUMP_SRC_FILES := $(wildcard $(LOCAL_PATH)/Gump/*.cpp)
THIRD_PARTY_SRC_FILES += $(wildcard $(THIRD_PARTY_FOLDER)/tinyxml2/tinyxml2.cpp)
THIRD_PARTY_SRC_FILES += $(wildcard $(THIRD_PARTY_FOLDER)/Box2D/*/*.cpp)
THIRD_PARTY_SRC_FILES += $(wildcard $(THIRD_PARTY_FOLDER)/Box2D/*/*/*.cpp)
THIRD_PARTY_SRC_FILES += $(wildcard $(THIRD_PARTY_FOLDER)/poly2tri/**/*.cc)
LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c $(THIRD_PARTY_SRC_FILES) $(GUMP_SRC_FILES)
LOCAL_SHARED_LIBRARIES := SDL2_image SDL2_mixer SDL2_net SDL2
LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog
include $(BUILD_SHARED_LIBRARY)
我的猜测(结果是错误的(:
在写完这个问题并仔细观察以尽可能向你们提供有关我的问题的最准确信息之后,我注意到给出错误的 obj 文件是我在文件夹级别也使用了通配符的文件。例如:$(ROOT)/*/*.cpp
。虽然这些通配符没有问题:$(ROOT)/Gump/*.cpp
.我不确定,但我想通配符在链接这些不同架构时的工作方式不同......
更新:
我已经再次测试了它,没有对文件夹使用通配符,并且出现了关于多个定义的相同错误。
每次构建新的 ABI 时都会附加文件列表。 LOCAL_SRC_FILES
通过include $(CLEAR_VARS)
被擦除; 每次都会重新定义GUMP_SRC_FILES
。但THIRD_PARTY_SRC_FILES
只会越来越长。正如您所注意到的,这与通配符无关。只需添加行
THIRD_PARTY_SRC_FILES :=
include $(CLEAR_VARS)
后,您的构建将没问题。
运行ndk-build V=1
显示在此过程中执行的生成命令。在那里,我可以看到.o
文件被链接了两次。我不确定这是什么原因。我想这可能是由于 src/
文件夹中的 android makefile 使用了他父目录中的来源:../ThirdParty/[morehere]
.
我通过为这些第三方库创建额外的 makefile 来修复它,所以现在每个库都在 .so 文件中创建一个共享库。在编译时链接。我认为这更整洁,因为更改生成文件只需要重新编译该子项目。
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++ 如何将两个 makefile 对象目标规则(位于另一个文件夹中)合并到一个目标/规则中?
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- makefile 需要调用两次
- Android makefile 链接两次
- Makefile - section执行两次的问题