为C++;函数,以便可以从C代码中使用它们 我现在正在编写C++函数的包装器,这样它们就可以从C代码中使用。

为C++;函数,以便可以从C代码中使用它们 我现在正在编写C++函数的包装器,这样它们就可以从C代码中使用。,c++,interface,unix,C++,Interface,Unix,其思想是使用g++编译cpp文件,使用gcc编译c文件,然后将它们链接在一起(!),但通过在头文件“test.h”(或者可能是test.hpp?)中提供它们,只向c程序公开那些需要的函数,如下所示: (注意我如何不公开函数“向量标记化(常量字符串和str,常量字符串和分隔符)”) 测试h: test.cpp: #包括 #包括 #包括 #包括 一旦我运行带有选项“-fno exceptions-fno rtti”的g++时,输出现在会失败,出现“未满足的数据符号'\u ZNSs4\u Rep20\

其思想是使用g++编译cpp文件,使用gcc编译c文件,然后将它们链接在一起(!),但通过在头文件“test.h”(或者可能是test.hpp?)中提供它们,只向c程序公开那些需要的函数,如下所示:

(注意我如何不公开函数“向量标记化(常量字符串和str,常量字符串和分隔符)”)

测试h:

test.cpp:

#包括
#包括
#包括
#包括

一旦我运行带有选项“-fno exceptions-fno rtti”的g++时,输出现在会失败,出现“未满足的数据符号'\u ZNSs4\u Rep20\u S\u empty\u rep\u storageE'”

当然,这两个环境(编译-HP-UX B.11.23 ia64的环境和在-HP-UX B.11.31 ia64上运行二进制文件的环境)具有不同的库版本(但架构相同),这不应成为出现错误的原因

我还想测试标有“//TODO:HOW to test this scenario?”(如何测试此场景?)的案例,但这可以等到现在


任何指针?

在链接时避免未定义符号的最简单方法是使用g++(不是gcc)链接。不过,您仍然可以使用gcc编译.c文件


也请一次使用系统。如果在同一系统上运行所有gcc和g++命令(无论是旧的还是新的),链接错误可能会消失。

在链接时避免未定义符号的最简单方法是使用g++(不是gcc)链接。不过,您仍然可以使用gcc编译.c文件


也请一次使用系统。如果你在同一系统上运行所有的GCC和G+命令(不管旧的还是新的),链接错误可能消失。< /P> < P>从C调用C++函数,你不能有被损坏的名字。删除执行
外部“C”
cplusplus的条件测试。即使你的函数将由C++编译器编译,使用<代码>外“C”< /C>会使它避免名字的混乱。

以下是一个例子:

C文件

/* a.c */
#include "test.h"

void call_cpp(void)
{
  cpp_func();
}

int main(void)
{
  call_cpp();
  return 0;
}
头文件

/* test.h */
#ifndef TEST_H
#define TEST_H
extern "C" void cpp_func(void);
#endif
CPP文件

// test.cpp
#include <iostream>
#include "test.h"

extern "C" void cpp_func(void)
{
  std::cout << "cpp_func" << std::endl;
}

< >从C调用C++函数,不能有被损坏的名称。删除执行
外部“C”
cplusplus的条件测试。即使你的函数将由C++编译器编译,使用<代码>外“C”< /C>会使它避免名字的混乱。

以下是一个例子:

C文件

/* a.c */
#include "test.h"

void call_cpp(void)
{
  cpp_func();
}

int main(void)
{
  call_cpp();
  return 0;
}
头文件

/* test.h */
#ifndef TEST_H
#define TEST_H
extern "C" void cpp_func(void);
#endif
CPP文件

// test.cpp
#include <iostream>
#include "test.h"

extern "C" void cpp_func(void)
{
  std::cout << "cpp_func" << std::endl;
}


有没有理由不考虑修改Swig来实现这一点?我似乎还记得Swig的一个发展分支可以做到这一点…

您有没有理由不考虑修改Swig来做到这一点?我似乎记得Swig的一个发展分支正在做这件事…

这就是我做的:g++-c-fPIC-Wall-Wuninitialized-fno异常-fno rtti-O-D_uhpuxita-mlp64-I$(INCLUDEPATH)$;gcc-c-fPIC-Wall-Wstrict原型-Wuninitialized-O-D_uHPUXITA-mlp64-I$(包括路径)$;GCC - AA - Aa - MLP64 -共享-L $(LBPATH)$(Objs)-O$(app)+ 1,问题是最后一行,你应该链接G+ +而不是GCC,默认情况下将包括所有必要的C++素材。埃文,是的,但是结果二进制不是一个带被损坏的名字的C++二进制文件吗?我希望得到的二进制代码是C。我只想在使用STL的特定情况下使用C++,但结果是二进制的C兼容。消息“找不到库”LBSTDC+++。所以“现在停止所有的乐趣。如果我可以自己定位库,现在的可执行文件现在就可以运行了。有趣的是,即使我设置了SLIBYPATH,LD_LIBRARY_PATH_64,LD_LIBRARY_PATH,甚至指向.so文件的路径,我仍然收到错误消息!这就是我所做的:g++-c-fPIC-Wall-Wuninitialized-fno异常-fno rtti-O-D_uhpuxita-mlp64-I$(INCLUDEPATH)$<;gcc-c-fPIC-Wall-Wstrict原型-Wuninitialized-O-D_uHPUXITA-mlp64-I$(包括路径)$;GCC - AA - Aa - MLP64 -共享-L $(LBPATH)$(Objs)-O$(app)+ 1,问题是最后一行,你应该链接G+ +而不是GCC,默认情况下将包括所有必要的C++素材。埃文,是的,但是结果二进制不是一个带被损坏的名字的C++二进制文件吗?我希望得到的二进制代码是C。我只想在使用STL的特定情况下使用C++,但结果是二进制的C兼容。消息“找不到库”LBSTDC+++。所以“现在停止所有的乐趣。如果我可以自己定位库,现在的可执行文件现在就可以运行了。有趣的是,即使我设置了SLIBYPATH,LD_LIBRARY_PATH_64,LD_LIBRARY_PATH,甚至指向.so文件的路径,我仍然收到错误消息!我应该使用GCC而不是G++来链接——不像埃文上面所说的那样:移除条件测试来避免名字的混乱似乎会影响头文件中的原型声明,因为GCC在对我咆哮“警告:函数的隐式声明”ToKeNeCeC“”条件化的工作只针对C++,在那里它应该工作…我相信这不是问题所在。为什么我需要在两个位置都使用外部程序-源和头?标题中包含的内容还不够吗?声明和定义必须匹配。这就是你得到“警告:函数'TokenizeC'的隐式声明”的原因。我应该使用gcc而不是g++来链接-不像Evan上面说的那样?删除条件测试以获得无名称混乱似乎会弄乱头文件中的原型声明,因为gcc会对我咆哮“警告:函数的隐式声明”ToKeNeCe''仅用于C++的条件工作,它应该工作……我相信这不是问题。为什么我需要在两个地方都有外部的?源和头?我没有它。
g++ a.c test.cpp