Linking in C++ compilers (including g++) causes references to be created with their arguments. Due to this, trace library headers included into C++ code base will cause their objects to built with symbols with arguments. Apparently this is to support operator overloading in C++. This causes linker errors. For example, here's what I get when I try to link libtracecmd with a main.o built from a C++ main.cc source file. main.cc:(.text+0x90): undefined reference to `tracecmd_get_tep(tracecmd_input*)' undefined reference to `tracecmd_free_record(tep_record*)' undefined reference to `tracecmd_read_data(tracecmd_input*, int)' The standard fix for this is to wrap the C project's header in extern "C". With this patch, I am able to link libtracecmd into a C++ code base. Signed-off-by: Joel Fernandes (Google) <joel@xxxxxxxxxxxxxxxxx> --- include/trace-cmd/trace-cmd.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/trace-cmd/trace-cmd.h b/include/trace-cmd/trace-cmd.h index 4963f45..b050233 100644 --- a/include/trace-cmd/trace-cmd.h +++ b/include/trace-cmd/trace-cmd.h @@ -9,6 +9,10 @@ #include "event-parse.h" #include "tracefs.h" +#ifdef __cplusplus +extern "C" { +#endif + struct tracecmd_input; enum tracecmd_open_flags { @@ -78,5 +82,8 @@ struct tracecmd_filter *tracecmd_filter_add(struct tracecmd_input *handle, const char *filter_str, bool neg); enum tracecmd_filters tracecmd_filter_match(struct tracecmd_filter *filter, struct tep_record *record); +#ifdef __cplusplus +} +#endif #endif /* _TRACE_CMD_H */ -- 2.25.1