C++;如果应用程序使用“创建”,则不会捕获异常-dynamic-lc-ldl-lpthread“; 我有C++应用程序,使用Boost,Asio和OpenSSL。 我尝试在Ubuntu 16.04中构建应用程序,但我被绊住了
所有C++;如果应用程序使用“创建”,则不会捕获异常-dynamic-lc-ldl-lpthread“; 我有C++应用程序,使用Boost,Asio和OpenSSL。 我尝试在Ubuntu 16.04中构建应用程序,但我被绊住了,c++,linux,exception,gcc,exception-handling,C++,Linux,Exception,Gcc,Exception Handling,所有.cpp文件都已正确编译。编译标志:-m64-O0-Wall-Wextra-MMD-std=c++11 与链接,我有一个问题。链接器的我的命令行: LIBS = -static -L$(BOOST_LIBS) -l:..boostlibs \ -L$(OPENSSL_LIBS) -l:libssl.a -l:libcrypto.a \ -Wl,-Bdynamic -lc -ldl -lpthread \ -Wl,-dynamic-linker=/lib64/ld-li
.cpp
文件都已正确编译。编译标志:-m64-O0-Wall-Wextra-MMD-std=c++11
与链接,我有一个问题。链接器的我的命令行:
LIBS = -static -L$(BOOST_LIBS) -l:..boostlibs \
-L$(OPENSSL_LIBS) -l:libssl.a -l:libcrypto.a \
-Wl,-Bdynamic -lc -ldl -lpthread \
-Wl,-dynamic-linker=/lib64/ld-linux-x86-64.so.2
g++ *.o $(LIBS) -o executablefile
(*.o
表示应用程序所需的所有对象文件的列表)
此命令工作正常,可以启动应用程序。但是在这个应用程序中,blockstry{}catch(…){}
根本不起作用。如果引发任何异常-我的应用程序终止
try
{
throw std::exception();
}
catch(...)
{
std::cerr << "hello from the catch.";
}
我制作了一个简单的应用程序,只使用共享库来构建它。也就是说,我从链接器选项中删除了-Wl,-b动态
。一切正常,例外情况被捕获。
但我的应用程序需要共享LIB,我不知道该怎么办
如何修复异常捕获
p.S.
需要参数-Wl,-Bdynamic-lc-ldl-lpthread
,因为如果没有它们,我会从链接器中得到错误:
LIBS = -static -L$(BOOST_LIBS) -l:..boostlibs \
-L$(OPENSSL_LIBS) -l:libssl.a -l:libcrypto.a \
-Wl,-Bdynamic -lc -ldl -lpthread \
-Wl,-dynamic-linker=/lib64/ld-linux-x86-64.so.2
g++ *.o $(LIBS) -o executablefile
/home/../openssl/openssl-1.0.2h-x64-build/lib/libcrypto.a(dso_dlfcn.o):
在函数dlfcn\u globallookup中:dso\u dlfcn.c:(.text+0x11):警告:
在静态链接的应用程序中使用“dlopen”需要在运行时
用于链接的glibc版本的共享库
/home/../xxx.o:In
功能
boost::asio::detail::resolver\u service::resolve(std::shared\u ptr&,
boost::asio::ip::basic\u解析器\u查询常量&,
boost::system::error_code&'):
xxx.cpp:(.text. boost4asio6detail16冲突解决程序服务共享冲突解决程序3基本冲突解决程序查询系统错误代码[ zn5boost4asio6detail16冲突解决程序服务共享冲突解决程序3基本冲突解决程序查询系统错误代码]+0xd7):
警告:在静态链接的应用程序中使用“getaddrinfo”
在运行时需要使用glibc版本中的共享库
用于链接
这个错误描述得很好,似乎我必须使用共享库
参数-Wl,-dynamic linker=/lib64/ld-linux-x86-64.so.2
需要,因为g++
无法找到共享库的路径ld
。如果我尝试启动编译后的应用程序,我会得到一个错误:没有这样的文件或目录
p.S.2
我使用Ubuntu 16.04.2和gcc 5.4.0
UPD
我只是想说清楚。
如果我将下面的代码添加到main
功能的开头,我的应用程序将终止
try
{
throw std::exception();
}
catch(...)
{
std::cerr << "hello from the catch.";
}
试试看
{
抛出std::exception();
}
捕获(…)
{
std::cerr您是否记得在每个线程进程退出时/之前捕获异常?是的。所有线程起点都包装在try-catch中。如果我将测试代码添加到我的应用程序中,并且从try-catch内部抛出异常,则app terminated只是为了清除捕获是否在线程进程内?是)异常处理很好。Windows上的相同代码工作正常,您是否尝试过删除-static
?您是否记得在每个线程进程退出时/之前捕获异常?是。所有线程起点都包在try-catch中。如果我将测试代码添加到我的应用程序中并从我的nside try catch-app terminated只是为了清楚捕获是否在线程进程内?是)异常处理良好。Windows上的相同代码工作正常,您是否尝试过删除-static
?