我有使用Boost.Asio和OpenSSL的C ++应用程序。 我尝试在Ubuntu 16.04中构建应用程序而且我被困住了。
正确编译了所有.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
表示应用程序所需的所有目标文件的列表)
此命令正常,app可以启动。但是在这个应用程序中,块try{} catch(...){}
根本不起作用。如果抛出任何异常 - 我的应用终止。
我制作了简单的应用程序并仅使用共享库来构建它。即我从链接器选项中删除了-Wl,-Bdynamic
。一切正常,有例外。
但我的应用程序需要共享库,我不知道该怎么做。
如何修复异常捕获?
P.S。
需要参数-Wl,-Bdynamic -lc -ldl -lpthread
,因为没有它们我会从链接器中得到错误:
/家庭/.../的OpenSSL / OpenSSL的-1.0.2h-x64的构建/ LIB / libcrypto.a(dso_dlfcn.o): 在函数
dlfcn_globallookup': dso_dlfcn.c:(.text+0x11): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /home/.../xxx.o: In function
boost :: asio :: detail :: resolver_service :: resolve(std :: shared_ptr& ,, boost :: asio :: ip :: basic_resolver_query const&amp ;,, 提高::系统:: ERROR_CODE和放大器;)&#39 ;: 。xxx.cpp :( text._ZN5boost4asio6detail16resolver_serviceINS0_2ip3tcpEE7resolveERSt10shared_ptrIvERKNS3_20basic_resolver_queryIS4_EERNS_6system10error_codeE [_ZN5boost4asio6detail16resolver_serviceINS0_2ip3tcpEE7resolveERSt10shared_ptrIvERKNS3_20basic_resolver_queryIS4_EERNS_6system10error_codeE] + 0xd7): 警告:使用' getaddrinfo'在静态链接的应用程序中 在运行时需要使用glibc版本的共享库 用于链接
这个错误完美地描述了here,似乎我必须使用共享库。
需要参数-Wl,-dynamic-linker=/lib64/ld-linux-x86-64.so.2
,因为g++
无法找到共享库ld
的路径。如果我尝试启动已编译的应用程序,我会收到错误:No such file or directory
。
P.S。 2
我使用Ubuntu 16.04.2和gcc 5.4.0
UPD
要清楚。
如果我将以下代码添加到main
函数的开头 - 我的应用已终止。
try
{
throw std::exception();
}
catch(...)
{
std::cerr << "hello from the catch.";
}