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

difficulty linking c and c++ code in SCONS framework

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

的未定义引用

C 和 C++ 没有相同的调用约定,因此 C++ 无法识别来自其​​他 objects 的 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++ 都使用的 header 中,则需要包装 extern "C" 以便它对 C 编译器隐藏(可能看不懂)。

#ifdef __cplusplus
extern "C" {
#endif

    void function(int, sensor_xyz_s*);

#ifdef __cplusplus
}
#endif