我必须在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.它没有采用头文件。 (我不清楚这一点。)
请帮我解决此问题。
答案 0 :(得分:2)
在C
程序中C++
符号未定义时,表示其声明未标记为extern "C"
。
处理它的标准方法是将C
标题包裹在:
#ifdef __cplusplus
extern "C" {
#endif
// C declarations here
#ifdef __cplusplus
}
#endif
答案 1 :(得分:2)
extern "C"
块中的所有C符号;要么将#include
指令包装在这样的块中,要么将其放在标题中。 (检查标题中是否有这样的块。)另请参阅C ++ FAQ中的How to mix C and C++。