碰到个问题,先看报错:
FAILURE: Build completed with 2 failures.
1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':shotsync:externalNativeBuildDebug'.
> Build command failed.
Error while executing process D:\Android\AndroidSdk\cmake\3.10.2.4988404\bin\ with arguments {-C E:\work\projects\CameraShotSync\shotsync\.cxx\cmake\debug\armeabi-v7a shotsync socket stcrpc yyjson}
ninja: Entering directory `E:\work\projects\CameraShotSync\shotsync\.cxx\cmake\debug\armeabi-v7a'
[1/2] Building CXX object CMakeFiles//
[2/2] Linking CXX shared library E:\work\projects\CameraShotSync\shotsync\build\intermediates\cmake\debug\obj\armeabi-v7a\
FAILED: E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/debug/obj/armeabi-v7a/
/C "cd . && D:\Android\AndroidSdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi19 --gcc-toolchain=D:/Android/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=D:/Android/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -std=c++11 -O0 -fno-limit-debug-info -Wl,--exclude-libs, -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs, -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Wl,--exclude-libs, -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname, -o E:\work\projects\CameraShotSync\shotsync\build\intermediates\cmake\debug\obj\armeabi-v7a\ CMakeFiles// CMakeFiles// CMakeFiles// E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/debug/obj/armeabi-v7a/ E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/debug/obj/armeabi-v7a/ -llog -latomic -lm && cd ."
ld: error: undefined symbol: rpc_alloc()
>>> referenced by :27 (E:/work/projects/CameraShotSync/shotsync/src/main/cpp\:27)
>>> CMakeFiles//:(ClientInit)
>>> did you mean: extern "C" rpc_alloc
>>> defined in: E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/debug/obj/armeabi-v7a/
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================2: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':shotsync:externalNativeBuildRelease'.
> Build command failed.
Error while executing process D:\Android\AndroidSdk\cmake\3.10.2.4988404\bin\ with arguments {-C E:\work\projects\CameraShotSync\shotsync\.cxx\cmake\release\armeabi-v7a shotsync socket stcrpc yyjson}
ninja: Entering directory `E:\work\projects\CameraShotSync\shotsync\.cxx\cmake\release\armeabi-v7a'
[1/2] Building CXX object CMakeFiles//
[2/2] Linking CXX shared library E:\work\projects\CameraShotSync\shotsync\build\intermediates\cmake\release\obj\armeabi-v7a\
FAILED: E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/release/obj/armeabi-v7a/
/C "cd . && D:\Android\AndroidSdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi19 --gcc-toolchain=D:/Android/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=D:/Android/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -std=c++11 -Oz -DNDEBUG -Wl,--exclude-libs, -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs, -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Wl,--exclude-libs, -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname, -o E:\work\projects\CameraShotSync\shotsync\build\intermediates\cmake\release\obj\armeabi-v7a\ CMakeFiles// CMakeFiles// CMakeFiles// E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/release/obj/armeabi-v7a/ E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/release/obj/armeabi-v7a/ -llog -latomic -lm && cd ."
ld: error: undefined symbol: rpc_alloc()
>>> referenced by :27 (E:/work/projects/CameraShotSync/shotsync/src/main/cpp\:27)
>>> CMakeFiles//:(ClientInit)
>>> did you mean: extern "C" rpc_alloc
>>> defined in: E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/release/obj/armeabi-v7a/
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================* Get more help at
BUILD FAILED in 918ms
41 actionable tasks: 2 executed, 39 up-to-date
其实cmake模块依赖啥的写得没问题,问题就在源码里,对C库的头文件引用,是直接写在了C++文件里,并且没有加extern "C",把C库的头文件引用扔到对应的头文件里,并且包含里在extern "C"里就好了,像这样:
#ifndef CAMERASHOTSYNC_SYNCCLIENT_H
#define CAMERASHOTSYNC_SYNCCLIENT_H
#ifdef __cplusplus
extern "C"{
#endif
#include "libstc-rpc/include/stc_rpc.h"
namespace client {
int ClientInit(char *host, char const *port = "55555");
int ClientDestroy();
}
#ifdef __cplusplus
}
#endif
#endif //CAMERASHOTSYNC_SYNCCLIENT_H
而不是像这样:
#include ""
#include <>
#include <>
#include <>
#include "libstc-rpc/include/stc_rpc.h"
namespace client {
int sfd;
int ClientInit(char *host, char const *port) {
int ret;
rpc_t* rpc = rpc_alloc();
return 0;
}
int ClientDestroy() {
int ret;
return 0;
}
}
可以参考文章:
extern "C"的用法_fatshaw的博客-****博客
/tags/