如何解决C ++编译器中的链接器错误

时间:2011-10-04 10:13:16

标签: c++ c linker-errors pjsip

我必须在PJSIP编译器中编译CPP。因为我正在使用PJSIP集成API。它位于CPP。所以我必须使用g++而不是gcc。但是现在我没有集成任何其他API。

但我在CPP编译器中遇到链接器错误。如果它是C编译器,它工作正常。

错误:

Undefined symbols for architecture arm:
  "_crypto_alloc", referenced from:
      srtp_stream_clone(srtp_stream_ctx_t const*, unsigned int, srtp_stream_ctx_t**)in libsrtp-arm-apple-darwin9.a(srtp.o)
      srtp_stream_alloc(srtp_stream_ctx_t**, srtp_policy_t const*) in libsrtp-arm-apple-darwin9.a(srtp.o)
      _srtp_create in libsrtp-arm-apple-darwin9.a(srtp.o)
  "_aes_icm_context_init", referenced from:
      srtp_kdf_init(srtp_kdf_t*, unsigned char const*)in libsrtp-arm-apple-darwin9.a(srtp.o)
  "_crypto_kernel_load_debug_module", referenced from:
      _srtp_init in libsrtp-arm-apple-darwin9.a(srtp.o)
  "_rdbx_init", referenced from:
      srtp_stream_init(srtp_stream_ctx_t*, srtp_policy_t const*) in libsrtp-arm-apple-darwin9.a(srtp.o)
      srtp_stream_clone(srtp_stream_ctx_t const*, unsigned int, srtp_stream_ctx_t**)in libsrtp-arm-apple-darwin9.a(srtp.o)
  "_key_limit_clone", referenced from:
      srtp_stream_clone(srtp_stream_ctx_t const*, unsigned int, srtp_stream_ctx_t**)in libsrtp-arm-apple-darwin9.a(srtp.o)
  "_auth_get_tag_length", referenced from:
      _srtp_unprotect_rtcp in libsrtp-arm-apple-darwin9.a(srtp.o)
      _srtp_protect_rtcp in libsrtp-arm-apple-darwin9.a(srtp.o)
      _srtp_unprotect in libsrtp-arm-apple-darwin9.a(srtp.o)
      _srtp_protect in libsrtp-arm-apple-darwin9.a(srtp.o)
...
...

实际上我没有改变makefile中的任何内容。

注意:的 在srtp.c文件中,已包含alloc.h文件。我赞扬并编辑了它。我只得到了相同的链接器错误。我在想两种方式。但我对此并不确定 1.它没有与.o文件链接 2.它没有采用头文件。 (我不清楚这一点。)

请帮我解决此问题。

2 个答案:

答案 0 :(得分:2)

C程序中C++符号未定义时,表示其声明未标记为extern "C"

处理它的标准方法是将C标题包裹在:

#ifdef __cplusplus
extern "C" {
#endif

// C declarations here

#ifdef __cplusplus
}
#endif

答案 1 :(得分:2)

  1. 不要使用C ++编译器编译C源代码。只需使用C编译器对其进行编译,然后使用C ++链接器将其链接到C ++程序中。
  2. 声明extern "C"块中的所有C符号;要么将#include指令包装在这样的块中,要么将其放在标题中。 (检查标题中是否有这样的块。)
  3. 另请参阅C ++ FAQ中的How to mix C and C++