taka-no-me / android-cmake

CMake toolchain file and other scripts for the Android NDK
1.22k stars 438 forks source link

Cmake project builds fine but cannot link to subproject #72

Closed mclbn closed 8 years ago

mclbn commented 8 years ago

I'm getting a linking error when building a cmake project for android using these scripts. The project consists in a static library and a binary, linked to it. Here is the structure of my project :

.
├── android_project       <-- Main project, an executable, linked against "assets" static library
│   ├── CMakeLists.txt        <-- "subdirs(src)"
│   ├── include
│   └── src
│       ├── android_project.c
│       └── CMakeLists.txt    <-- see below
├── assets            <-- Is a static library
│   ├── CMakeLists.txt        <-- "subdirs(src)"
│   ├── include
│   │   └── asset.hpp
│   └── src
│       ├── asset.cpp
│       └── CMakeLists.txt
├── cmake
│   ├── android-cmake
│   │   ├── AndroidNdkGdb.cmake
│   │   ├── AndroidNdkModules.cmake
│   │   ├── android.toolchain.cmake
│   │   ├── ndk_links.md
│   │   └── README.md
│   └── modules
└── CMakeLists.txt        <-- Basic settings (i.e. compilation flags) and "subdirs(android_project, assets)", see below

My ./CMakeLists.txt looks like this ;

cmake_minimum_required(VERSION 2.8)
project(android_project C CXX)

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)

set(CMAKE_CXX_FLAGS "-v -std=c++11 -pedantic -Wall -Weffc++ -Wcast-align ")
set(CMAKE_CXX_FLAGS_DEBUG "-g")

set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/bin/")

subdirs(${PROJECT_NAME} assets)

My ./androidproject/src/CMakeLists.txt looks like this :

set(CMAKE_VERBOSE_MAKEFILE ON)

include_directories(${${PROJECT_NAME}_SOURCE_DIR}/android_project/include)

file(GLOB android_project_SRCS *.cpp *.c)

add_executable(${PROJECT_NAME} ${android_project_SRCS})
target_link_libraries(${PROJECT_NAME} assets)

I build my project :

mkdir build && cd build

cmake -DCMAKE_TOOLCHAIN_FILE=./cmake/android-cmake/android.toolchain.cmake -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-clang3.6 -DANDROID_NDK=/opt/android-ndk-r10e -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI="armeabi-v7a" ..
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/android_project/build

make
/usr/bin/cmake -H/tmp/android_project -B/tmp/android_project/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /tmp/android_project/build/CMakeFiles /tmp/android_project/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/tmp/android_project/build'
make -f assets/src/CMakeFiles/assets.dir/build.make assets/src/CMakeFiles/assets.dir/depend
make[2]: Entering directory `/tmp/android_project/build'
cd /tmp/android_project/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /tmp/android_project /tmp/android_project/assets/src /tmp/android_project/build /tmp/android_project/build/assets/src /tmp/android_project/build/assets/src/CMakeFiles/assets.dir/DependInfo.cmake --color=
Scanning dependencies of target assets
make[2]: Leaving directory `/tmp/android_project/build'
make -f assets/src/CMakeFiles/assets.dir/build.make assets/src/CMakeFiles/assets.dir/build
make[2]: Entering directory `/tmp/android_project/build'
/usr/bin/cmake -E cmake_progress_report /tmp/android_project/build/CMakeFiles 2
[ 50%] Building CXX object assets/src/CMakeFiles/assets.dir/asset.cpp.o
cd /tmp/android_project/build/assets/src && /opt/android-ndk-r10e/toolchains/llvm-3.6/prebuilt/linux-x86_64/bin/clang++   -DANDROID -v -std=c++11 -pedantic -Wall -Weffc++ -Wcast-align  -mthumb -fomit-frame-pointer -fno-strict-aliasing -O3 -DNDEBUG -isystem /opt/android-ndk-r10e/platforms/android-8/arch-arm/usr/include -isystem /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include -isystem /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -isystem /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include/backward -I/tmp/android_project/assets/include    -o CMakeFiles/assets.dir/asset.cpp.o -c /tmp/android_project/assets/src/asset.cpp
clang version 3.6 
Target: x86_64-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.4
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.1
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Candidate multilib: .;@m64
Selected multilib: .;@m64
clang: warning: argument unused during compilation: '-mthumb'
 "/opt/android-ndk-r10e/toolchains/llvm-3.6/prebuilt/linux-x86_64/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -disable-free -main-file-name asset.cpp -mrelocation-model static -mthread-model posix -relaxed-aliasing -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -target-linker-version 2.24 -momit-leaf-frame-pointer -v -dwarf-column-info -coverage-file /tmp/android_project/build/assets/src/CMakeFiles/assets.dir/asset.cpp.o -resource-dir /opt/android-ndk-r10e/toolchains/llvm-3.6/prebuilt/linux-x86_64/bin/../lib/clang/3.6 -isystem /opt/android-ndk-r10e/platforms/android-8/arch-arm/usr/include -isystem /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include -isystem /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -isystem /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include/backward -D ANDROID -D NDEBUG -I /tmp/android_project/assets/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/backward -internal-isystem /usr/local/include -internal-isystem /opt/android-ndk-r10e/toolchains/llvm-3.6/prebuilt/linux-x86_64/bin/../lib/clang/3.6/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -Wall -Weffc++ -Wcast-align -pedantic -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /tmp/android_project/build/assets/src -ferror-limit 19 -fmessage-length 237 -mstackrealign -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -o CMakeFiles/assets.dir/asset.cpp.o -x c++ /tmp/android_project/assets/src/asset.cpp
clang -cc1 version 3.6 based upon LLVM 3.6 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/include"
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8"
#include "..." search starts here:
#include <...> search starts here:
 /tmp/android_project/assets/include
 /opt/android-ndk-r10e/platforms/android-8/arch-arm/usr/include
 /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include
 /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include
 /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include/backward
 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8
 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8
 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/backward
 /usr/local/include
 /opt/android-ndk-r10e/toolchains/llvm-3.6/prebuilt/linux-x86_64/bin/../lib/clang/3.6/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
Linking CXX static library libassets.a
cd /tmp/android_project/build/assets/src && /usr/bin/cmake -P CMakeFiles/assets.dir/cmake_clean_target.cmake
cd /tmp/android_project/build/assets/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/assets.dir/link.txt --verbose=1
/opt/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc-ar cr libassets.a  CMakeFiles/assets.dir/asset.cpp.o
/opt/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ranlib libassets.a
make[2]: Leaving directory `/tmp/android_project/build'
/usr/bin/cmake -E cmake_progress_report /tmp/android_project/build/CMakeFiles  2
[ 50%] Built target assets
make -f android_project/src/CMakeFiles/android_project.dir/build.make android_project/src/CMakeFiles/android_project.dir/depend
make[2]: Entering directory `/tmp/android_project/build'
cd /tmp/android_project/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /tmp/android_project /tmp/android_project/android_project/src /tmp/android_project/build /tmp/android_project/build/android_project/src /tmp/android_project/build/android_project/src/CMakeFiles/android_project.dir/DependInfo.cmake --color=
Scanning dependencies of target android_project
make[2]: Leaving directory `/tmp/android_project/build'
make -f android_project/src/CMakeFiles/android_project.dir/build.make android_project/src/CMakeFiles/android_project.dir/build
make[2]: Entering directory `/tmp/android_project/build'
/usr/bin/cmake -E cmake_progress_report /tmp/android_project/build/CMakeFiles 1
[100%] Building C object android_project/src/CMakeFiles/android_project.dir/android_project.c.o
cd /tmp/android_project/build/android_project/src && /opt/android-ndk-r10e/toolchains/llvm-3.6/prebuilt/linux-x86_64/bin/clang  -DANDROID -fexceptions -fpic -gcc-toolchain /opt/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64 -target armv7-none-linux-androideabi -Qunused-arguments --sysroot=/opt/android-ndk-r10e/platforms/android-8/arch-arm -funwind-tables -fsigned-char -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fdata-sections -ffunction-sections -Xclang -mnoexecstack  -mthumb -fomit-frame-pointer -fno-strict-aliasing -O3 -DNDEBUG -isystem /opt/android-ndk-r10e/platforms/android-8/arch-arm/usr/include -isystem /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include -isystem /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -isystem /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include/backward -I/tmp/android_project/android_project/include    -o CMakeFiles/android_project.dir/android_project.c.o   -c /tmp/android_project/android_project/src/android_project.c
Linking CXX executable ../../bin/android_project
cd /tmp/android_project/build/android_project/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/android_project.dir/link.txt --verbose=1
/opt/android-ndk-r10e/toolchains/llvm-3.6/prebuilt/linux-x86_64/bin/clang  -v -std=c++11 -pedantic -Wall -Weffc++ -Wcast-align  -mthumb -fomit-frame-pointer -fno-strict-aliasing -O3 -DNDEBUG   -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,-z,nocopyreloc CMakeFiles/android_project.dir/android_project.c.o -o ../../bin/android_project  -L/libs/armeabi-v7a -rdynamic ../../assets/src/libassets.a  "/opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libgnustl_static.a" "/opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libsupc++.a" -lm
clang version 3.6 
Target: x86_64-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.4
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.1
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/usr/bin/ld" -export-dynamic -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o ../../bin/android_project /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/libs/armeabi-v7a -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -L/opt/android-ndk-r10e/toolchains/llvm-3.6/prebuilt/linux-x86_64/bin/../lib -L/lib -L/usr/lib --fix-cortex-a8 --no-undefined --gc-sections -z noexecstack -z relro -z now -z nocopyreloc CMakeFiles/android_project.dir/android_project.c.o ../../assets/src/libassets.a /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libgnustl_static.a /opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libsupc++.a -lm -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o
/usr/bin/ld: unrecognized option '--fix-cortex-a8'
/usr/bin/ld: use the --help option for usage information
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [bin/android_project] Error 1
make[2]: Leaving directory `/tmp/android_project/build'
make[1]: *** [android_project/src/CMakeFiles/android_project.dir/all] Error 2
make[1]: Leaving directory `/tmp/android_project/build'
make: *** [all] Error 2

The project builds and links without problem natively (i.e. using the host system's clang for x86_64). I also tried with another ANDROID_TOOLCHAIN_NAME (arm gcc) without success.

From what I understand, it is the system linker (/usr/bin/ld) that is called at the end. Should not it be the toolchain's linker (/opt/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld) ?

When I print the value of ${CMAKE_LINKER}, i get the right value (/opt/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld), in both the root CMakeLists.txt and android_project/src/CMakeLists.txt.

Since my project is rather small and its architecture quite classic, there might be something I am doing something wrong. But I cannot figure what.

Anyone got pointers or suggestions regarding this error ?

mclbn commented 8 years ago

Just found what I was doing wrong. I was overwriting ${CMAKE_CXX_FLAGS} instead of appending to it, losing --sysroot=... and other valuable flags. Sorry for the spam. I hope this will help another beginner making the same mistakes :-)