ld: error: undefined symbol: did you mean: extern “C“

2023-05-16

碰到个问题,先看报错:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ld: error: undefined symbol: did you mean: extern “C“ 的相关文章

随机推荐