如何在C库实现文件中使用C++ STL容器并通过GCC编译链接?
可行!解决C程序用GCC链接含STL的C++共享库的问题
当然可行啦!你遇到的__cxa_begin_catch未定义引用错误,本质是GCC作为C编译器,默认不会自动链接C++标准库,但你的共享库因为用了STL容器(vector),底层依赖C++标准库的符号,所以链接时找不到这些符号就报错了。下面给你两种实用的解决办法:
方法一:修改应用程序的链接命令(推荐)
用GCC编译C程序时,手动指定链接C++标准库libstdc++就行。修改后的完整编译流程:
# 先编译C++共享库(和原来的命令一致) g++ -c -fpic -shared -std=c++0x -o libmynums.so mynums.cpp # GCC编译C程序,链接时加上-lstdc++ gcc -L. -lmynums -lstdc++ -o app app.c
这样GCC就会把C++标准库的依赖也带上,那些缺失的符号就能找到了。
方法二:编译共享库时静态链接C++标准库(可选)
如果你不想让应用程序链接时额外加-lstdc++,可以在编译共享库时把C++标准库静态链接进去。不过这种方式会增大库的体积,且可能带来兼容性问题,按需选择:
# 编译共享库时加上-static-libstdc++参数 g++ -c -fpic -shared -std=c++0x -static-libstdc++ -o libmynums.so mynums.cpp # 之后用GCC编译链接就不需要额外加参数了 gcc -L. -lmynums -o app app.c
为什么第一组命令能成功?
因为你用g++编译链接C程序时,g作为C编译器,会自动帮你链接C标准库,所以STL相关的符号都能被正确找到,自然不会报错。而GCC是纯C编译器,默认只处理C标准库的依赖,不会管C的东西。
额外提醒
你的头文件已经正确用*extern "C"*包裹了函数声明,这部分做得非常好!它避免了C++的名字修饰问题,确保C程序能正确识别共享库导出的函数符号,这部分不需要修改。如果运行程序时提示找不到libmynums.so,可以用export LD_LIBRARY_PATH=.临时指定库的搜索路径,或者编译时加上-Wl,-rpath=.参数把路径写到程序里。
内容的提问来源于stack exchange,提问作者Raven
相关产品推荐
相关产品推荐

