如果使用" -dynamic -lc -ldl -lpthread"

时间:2016-09-04 19:49:29

标签: c++ linux exception gcc exception-handling

我有使用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.";
}

0 个答案:

没有答案