我有三个文件:
main.cpp
utils.h
utils.c
在main.cpp内部,我有:
#include "utils.h" uint64_t ToolLists::GetAddress(const char* name) { MyObject object; return ::FindTest(object, name); //(also tried without ::) }
Inside utils.h:
uint64_t FindTest(const MyObject object, const char* procName);
内部utils.c:
uint64_t FindTest(const MyObject exports, const char* procName) { return 0; }
但是在编译时出现以下错误,我真的不明白为什么:
/usr/bin/ld: CMakeFiles/data.dir/main.cpp.o: in function `ToolLists::GetAddress(char const*)':main.cpp:(.text+0x121): undefined reference to `FindTest'
我的代码有什么问题?感谢您的任何帮助。
编辑:
我想做的是:
将我的C代码集成到该项目内的json_data下:https://github.com/meltwater/served
在示例中,您可以找到json_data。和main.cpp文件。
在main.cpp内,我已将调用添加到C函数中,并且还在其中复制了utils.h和utils.c。
make文件是通过服务的/根目录生成的(此命令还可以编译项目):
mkdir build && cd build && cmake.. && make
也我的utils.h文件已经有这个了:
#ifdef __cplusplus extern "C" { #endif // etc....
编辑:这是我正在使用的cmakelist:
https://github.com/meltwater/served/blob/master/src/examples/json_data/CMakeLists.txt
我已经在“ TARGET_LINK_LIBRARIES(json_data $ {json_data_LIBS})”之后编辑了包括这两行代码的代码:]
add_library(utils utils.c) target_include_directories(utils PUBLIC utils.h)
utils.c和utils.h都在同一目录中。这是正确的程序吗?
编辑:
解决了以下CMakeLists文件。
FILE (GLOB_RECURSE json_data_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp) SET (json_data_LIBS ${PROJECT_NAME} ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) ADD_EXECUTABLE (json_data ${json_data_SRCS}) add_library(utils utils.c) set(HEADER_FILES utils.h) TARGET_LINK_LIBRARIES (json_data ${json_data_LIBS} utils) INSTALL (TARGETS json_data DESTINATION bin)
如果要从C ++调用C语言中定义的函数,则必须使用extern“ C”(how does extern "C" work)。
尝试将标题更改为
...
#ifdef __cplusplus
extern "C"
{
#endif
// declarations of the functions you want to define in c
#ifdef __cplusplus
}
#endif
...