这是来自操作系统开发网站的二手问题,但它让我很好奇,因为我无法在任何地方找到合适的解释.
使用gcc编译和链接独立的C++程序时,有时会出现这样的链接器错误:
out/kernel.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
Run Code Online (Sandbox Code Playgroud)
这显然是因为这个符号是在libstdc ++中定义的,它在独立环境中是缺失的.解决问题只需要在某处定义此符号:
void *__gxx_personality_v0;
Run Code Online (Sandbox Code Playgroud)
这很好,但我不喜欢那些神奇地工作的东西......所以问题是,这个符号的目的是什么?
我用这个命令行得到了这个未定义的符号构建:
$ gcc test.cpp
Undefined symbols:
"___gxx_personality_v0", referenced from:
etc...
Run Code Online (Sandbox Code Playgroud)
test.cpp很简单,应该很好.这笔交易是什么?
我正在尝试使用JsonCpp库.我在Windows上,使用MinGW和CodeBlocks.
当我在json头中包含任何内容时,我的链接器会崩溃并发出这两个错误.我已经开始环顾四周了,我发现了另外两个基本上描述我问题的问题:
g ++和"未定义引用`__gxx_personality_v0'"的问题
如果我将两个缺失的变量声明为void指针,如下所示,则问题就会消失:
void * __gxx_personality_v0=0;
void * _Unwind_Resume =0;
Run Code Online (Sandbox Code Playgroud)
但是,我不明白为什么会发生这种错误.CodeBlocks已设置为使用migw32-g ++表示cpp文件,并且添加-lstdc ++选项并不能解决问题.选项-fno-exception也没有(我想要例外,请注意,我只是在尝试).
我还在同一个文件中包含一个boost库,不会造成任何问题.
编辑:
错误输出正是我在标题中所说的:在链接期间,我总共获得了22个未定义的_Unwind_Resume和__gxx_personality_v0引用.我的代码是:
#include <boost/algorithm/string.hpp>
#include <include/json/value.h>
//void * __gxx_personality_v0=0;
//void * _Unwind_Resume =0;
int main () {
std::string str1("Hello world!");
boost::to_upper(str1);
Json::Value k;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只有当我包含/使用JsonCPP库时才会出现错误.取消注释注释行可以解决问题.
命令行输出如下:
mingw32-g++.exe -Wall -fexceptions -g -DSFML_DYNAMIC -IC:\Users\Svalorzen\Documents\Projects\boost_1_49 -IC:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0 -IC:\Users\Svalorzen\Documents\Projects\SFML-1.6\include -IC:\Users\Svalorzen\Documents\Projects\hge181\include -c C:\Users\Svalorzen\Documents\Projects\test\main.cpp -o obj\Debug\main.o
mingw32-g++.exe -LC:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0 -LC:\Users\Svalorzen\Documents\Projects\SFML-1.6\lib -LC:\Users\Svalorzen\Documents\Projects\hge181\lib -o bin\Debug\test.exe obj\Debug\main.o -fno-exceptions -lsfml-graphics -lsfml-window -lsfml-system C:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0\libs\mingw\libjson_mingw_libmt.a C:\Users\Svalorzen\Documents\Projects\hge181\lib\gcc\libhge.a C:\Users\Svalorzen\Documents\Projects\hge181\lib\gcc\libhelp.a
Output size is 1.22 MB
Process terminated with …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个 cpp cmake 项目并链接到我的 Rust 项目。
cmake_minimum_required(VERSION 3.0)
set (CMAKE_CXX_STANDARD 17)
project(ZLMediaKit_LIB CXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
set(ENABLE_TESTS OFF FORCE)
option(ENABLE_TESTS OFF)
set(ENABLE_OPENSSL FALSE FORCE)
option(ENABLE_OPENSSL OFF)
add_subdirectory(ZLMediaKit)
add_library(libzlmediakit_cpp_interface STATIC interface.cpp)
target_include_directories(libzlmediakit_cpp_interface PUBLIC
.
${CMAKE_CURRENT_SOURCE_DIR}/ZLMediaKit/src
${CMAKE_CURRENT_SOURCE_DIR}/ZLMediaKit/3rdpart/ZLToolKit/src)
target_link_libraries(libzlmediakit_cpp_interface zlmediakit zltoolkit mpeg mov flv libstdc++)
install(TARGETS libzlmediakit_cpp_interface DESTINATION .)
Run Code Online (Sandbox Code Playgroud)
这是我的build.rs:
extern crate cmake;
use cmake::Config;
fn main()
{
let dst = Config::new("zlmediakit_lib").build();
println!("cargo:rustc-link-search=native={}", dst.display());
println!("cargo:rustc-link-lib=static=libzlmediakit_cpp_interface");
}
Run Code Online (Sandbox Code Playgroud)
但我收到未定义的参考错误:
ong)':
/usr/include/c++/9/ext/new_allocator.h:128: undefined reference to `operator delete(void*)'
/usr/bin/ld: /home/dev/orwell/liborwell_rust/zlmediakit_rust/target/debug/build/zlmediakit_rust-499cc82f14515635/out/liblibzlmediakit_cpp_interface.a(interface.cpp.o): in function `ZLRTSPClient::~ZLRTSPClient()':
/home/dev/orwell/liborwell_rust/zlmediakit_rust/zlmediakit_lib/ZLRTSPClient.h:14: undefined …Run Code Online (Sandbox Code Playgroud)