难以在SCONS框架中链接c和c ++代码

时间:2017-01-19 18:09:19

标签: c++ scons

我正在尝试在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*)'

的未定义引用

1 个答案:

答案 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