summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-02-12 23:14:03 +0800
committerruki <[email protected]>2020-02-12 13:24:19 +0800
commit7b08be3acbeeb49f691302ee9262a053171c70d5 (patch)
tree897ba8f5f155a9b817379df864393df227057690
parented630a48d2359dded29af7815f03604534b78f67 (diff)
fix linker errors for android ndk on windows
-rw-r--r--CHANGELOG.md2
-rw-r--r--xmake/modules/detect/sdks/find_ndk.lua16
-rw-r--r--xmake/platforms/android/config.lua8
-rw-r--r--xmake/platforms/android/load.lua9
4 files changed, 29 insertions, 6 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 058a99be2..21501bcc4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,7 @@
* Fix incremental compilation for checking the dependent file
* Fix log output for parsing xmake-vscode/problem info
+* [#684](https://github.com/xmake-io/xmake/issues/684): Fix linker errors for android ndk on windows
## v2.2.9
@@ -691,6 +692,7 @@
* 修复增量编译检测依赖文件的一些问题
* 修复log输出导致xmake-vscode插件解析编译错误信息失败问题
+* [#684](https://github.com/xmake-io/xmake/issues/684): 修复windows下android ndk的一些linker错误
## v2.2.9
diff --git a/xmake/modules/detect/sdks/find_ndk.lua b/xmake/modules/detect/sdks/find_ndk.lua
index 7b8114f35..70801d697 100644
--- a/xmake/modules/detect/sdks/find_ndk.lua
+++ b/xmake/modules/detect/sdks/find_ndk.lua
@@ -153,8 +153,21 @@ function _find_ndk(sdkdir, arch, ndk_sdkver, ndk_toolchains_ver)
return {}
end
+ -- get ndk version, e.g. r16b, ..
+ local ndkver = nil
+ local ndk_version_header = path.join(sdkdir, "sysroot/usr/include/android/ndk-version.h")
+ if os.isfile(ndk_version_header) then
+ local ndk_version_info = io.readfile(ndk_version_header)
+ if ndk_version_info then
+ ndk_version_info = ndk_version_info:match("#define __NDK_MAJOR__ (%d+)")
+ if ndk_version_info then
+ ndkver = tonumber(ndk_version_info)
+ end
+ end
+ end
+
-- ok?
- return {sdkdir = sdkdir, bindir = bindir, cross = cross, sdkver = sdkver, gcc_toolchain = gcc_toolchain, toolchains_ver = toolchains_ver}
+ return {ndkver = ndkver, sdkdir = sdkdir, bindir = bindir, cross = cross, sdkver = sdkver, gcc_toolchain = gcc_toolchain, toolchains_ver = toolchains_ver}
end
-- find ndk toolchains
@@ -193,6 +206,7 @@ function main(sdkdir, opt)
-- save to config
config.set("ndk", ndk.sdkdir, {force = true, readonly = true})
+ config.set("ndkver", ndk.ndkver, {force = true, readonly = true})
config.set("ndk_sdkver", ndk.sdkver, {force = true, readonly = true})
config.set("ndk_toolchains_ver", ndk.toolchains_ver, {force = true, readonly = true})
diff --git a/xmake/platforms/android/config.lua b/xmake/platforms/android/config.lua
index c69eb6b94..a51eac6b0 100644
--- a/xmake/platforms/android/config.lua
+++ b/xmake/platforms/android/config.lua
@@ -95,14 +95,14 @@ function _toolchains()
as:add({name = "gcc", cross = cross}, "clang")
-- init the linker
- ld:add({name = "gcc", cross = cross})
ld:add({name = "g++", cross = cross})
- ld:add("clang", "clang++")
+ ld:add({name = "gcc", cross = cross})
+ ld:add("clang++", "clang")
-- init the shared library linker
- sh:add({name = "gcc", cross = cross})
sh:add({name = "g++", cross = cross})
- sh:add("clang", "clang++")
+ sh:add({name = "gcc", cross = cross})
+ sh:add("clang++", "clang")
-- init the static library archiver
ar:add({name = "ar", cross = cross, pathes = gcc_toolchain_bin}, "llvm-ar")
diff --git a/xmake/platforms/android/load.lua b/xmake/platforms/android/load.lua
index 4e3146965..7975bdba4 100644
--- a/xmake/platforms/android/load.lua
+++ b/xmake/platforms/android/load.lua
@@ -82,6 +82,7 @@ function main(platform)
-- add flags for the sdk directory of ndk
local ndk = config.get("ndk")
+ local ndkver = config.get("ndkver")
local ndk_sdkver = config.get("ndk_sdkver")
if ndk and ndk_sdkver then
@@ -258,7 +259,13 @@ function main(platform)
platform:add("ldflags", "-lstlport_shared")
platform:add("shflags", "-lstlport_shared")
end
-
+
+ -- fix 'ld: error: cannot find -lc++' for clang++.exe on r20/windows
+ -- @see https://github.com/xmake-io/xmake/issues/684
+ if ndkver and ndkver >= 20 and ndk_cxxstl:startswith("llvmstl") then
+ platform:add("ldflags", "-nostdlib++")
+ platform:add("shflags", "-nostdlib++")
+ end
end
end