我正在尝试在scons中创建一个共享库,但它一直告诉我有一个错误,因为我写的一些函数有一个未定义的引用。我包含.c文件,我试图从中创建共享库。由于某种原因,它识别我输入的cpp文件,但不识别.c文件。
非常感谢你的帮助。
import os
Import('env')
env = env.Clone()
env.Append(CPPPATH=['include'])
env.Append(LIBS=['serial'])
env.Append(LIBPATH=['/usr/local/lib'])
env.Append(LIBS=['boost_date_time','boost_system', 'boost_thread'])
lib = []
binaries = []
lib.extend(env.SharedLibrary('File1.c', 'File2.cpp']))
print "the error is here"
test_env = env.Clone()
test_env.Append(LIBS=['Program'], LIBPATH=['.'])
binaries.extend([
test_env.Program('test_Program', Glob('test/test_Adafruit.cpp')),
])
Return('lib', 'binaries')
在链接阶段: 我得到的错误如下:
LINK build/test_Program
build/test_Program/libProgram.so:
对function(int, sensor_xyz_s*)'
答案 0 :(得分:1)
C和C ++没有相同的调用约定,因此C ++无法识别其他对象的C函数。如果你试图从File2.cpp中的C ++函数调用File1.c中的C函数,你需要(1)确保declare the C function with extern "C"
,(2)显式使用C ++编译器来创建File1 .o,或(3)将File1重命名为File1.cpp(假设您的C代码是有效的C ++)。最干净的解决方案可能是选项(1)。
要在SConscript中设置C编译器,请使用:
env['CC'] = env['CXX']
要告诉C ++代码function
是C函数,请将C函数的声明更改为以下内容。注意,这只是函数的声明 - 如果声明在C和C ++使用的头文件中,你需要包装extern“C”,以便它从C编译器中隐藏(可能不理解它) 。
#ifdef __cplusplus
extern "C" {
#endif
void function(int, sensor_xyz_s*);
#ifdef __cplusplus
}
#endif