IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> ld: error: undefined symbol: did you mean: extern “C“ -> 正文阅读

[移动开发]ld: error: undefined symbol: did you mean: extern “C“

碰到个问题,先看报错:

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\ninja.exe 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/shotsync.dir/SyncClient.cpp.o
? [2/2] Linking CXX shared library E:\work\projects\CameraShotSync\shotsync\build\intermediates\cmake\debug\obj\armeabi-v7a\libshotsync.so
? FAILED: E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/debug/obj/armeabi-v7a/libshotsync.so
? cmd.exe /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,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libshotsync.so -o E:\work\projects\CameraShotSync\shotsync\build\intermediates\cmake\debug\obj\armeabi-v7a\libshotsync.so CMakeFiles/shotsync.dir/shotsync.cpp.o CMakeFiles/shotsync.dir/SyncServer.cpp.o CMakeFiles/shotsync.dir/SyncClient.cpp.o? E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/debug/obj/armeabi-v7a/libsocket.so E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/debug/obj/armeabi-v7a/libstcrpc.so -llog -latomic -lm && cd ."
? ld: error: undefined symbol: rpc_alloc()
? >>> referenced by SyncClient.cpp:27 (E:/work/projects/CameraShotSync/shotsync/src/main/cpp\SyncClient.cpp:27)
? >>>?????????????? CMakeFiles/shotsync.dir/SyncClient.cpp.o:(ClientInit)
? >>> did you mean: extern "C" rpc_alloc
? >>> defined in: E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/debug/obj/armeabi-v7a/libstcrpc.so
? 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\ninja.exe 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/shotsync.dir/SyncClient.cpp.o
? [2/2] Linking CXX shared library E:\work\projects\CameraShotSync\shotsync\build\intermediates\cmake\release\obj\armeabi-v7a\libshotsync.so
? FAILED: E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/release/obj/armeabi-v7a/libshotsync.so
? cmd.exe /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,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libshotsync.so -o E:\work\projects\CameraShotSync\shotsync\build\intermediates\cmake\release\obj\armeabi-v7a\libshotsync.so CMakeFiles/shotsync.dir/shotsync.cpp.o CMakeFiles/shotsync.dir/SyncServer.cpp.o CMakeFiles/shotsync.dir/SyncClient.cpp.o? E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/release/obj/armeabi-v7a/libsocket.so E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/release/obj/armeabi-v7a/libstcrpc.so -llog -latomic -lm && cd ."
? ld: error: undefined symbol: rpc_alloc()
? >>> referenced by SyncClient.cpp:27 (E:/work/projects/CameraShotSync/shotsync/src/main/cpp\SyncClient.cpp:27)
? >>>?????????????? CMakeFiles/shotsync.dir/SyncClient.cpp.o:(ClientInit)
? >>> did you mean: extern "C" rpc_alloc
? >>> defined in: E:/work/projects/CameraShotSync/shotsync/build/intermediates/cmake/release/obj/armeabi-v7a/libstcrpc.so
? 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 https://help.gradle.org

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 "SyncClient.h"

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#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的博客-CSDN博客

https://www.csdn.net/tags/NtTaAg4sMjAtYmxvZwO0O0OO0O0O.html

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 18:20:14  更:2022-05-24 18:21:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 18:04:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码