难以在 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
我正在尝试在 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