[英]Error when static linking g++
我有一个问题,我想用mysql连接器的静态链接来编译我的应用程序。
我的命令行:
g ++ -o newserver stdafx.cpp ... -lboost_system -lboost_thread -lpthread -lmysqlcppconn -static /usr/lib/libmysqlcppconn-static.a -std = c ++ 0x
但是我有错误:
/usr/bin/ld: cannot find -lmysqlcppconn
/tmp/ccxpOfdZ.o: In function `IsEqualsDns(unsigned long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
Server.cpp:(.text+0x356e): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
collect2: ld returned 1 exit status
我怎样才能解决这个问题? 谢谢!
库libsqlcppconn.a
或libsqucppconn.so
(静态或动态)在哪里? 编译器正在寻找它,但是没有找到它。
大概这是与/usr/lib/mysqlcppconn-static.a
相同的库。 如果是这样,只需删除-lmysqlcppconn
。 或仅使用-lmysqlcppconn-static
(无空格),而无需考虑/usr/lib/libmysqlconn-static.a
。 使用这样的名称,应该没有对应的.so
,这意味着g ++将静态链接它,即使没有-static
。 如果在同一目录中同时存在libmysqlconn-static.so
和libmysqlconn-static.a
,则仅需要-static
。
关于第二个错误(这只是一个警告,但是如果您尝试在其他计算机上甚至在升级计算机后运行链接的程序,则会导致问题):如果在命令行的任何位置使用-static
(就像您当前所做的那样),那么它将应用于之后链接的所有文件。 包括系统库,你不想静态链接。 我的猜测是-static
不必要(请参见上文); 如果是,请将其紧紧放在要静态链接的库之前,然后将-dynamic
紧随其后(以便随后的任何库,包括系统库都将被动态链接)。
您可以尝试g++ -static YOUR ARGUMENTS
。
如果您来自Windows平台,则与Boost链接可能会给您带来一些惊喜。 典型的Boost安装(例如在./b2 install
)将同时创建动态库和静态库,并将它们放置在同一目录中。 通常,这两种库形式的扩展名(.so或.a)仅不同。
Windows支持自动链接 ,这基本上意味着库文件的前几个字节中包含一些标志,指示它们是用于动态链接还是用于静态链接。 在Linux平台上,情况并非如此,链接器会混淆要加载的文件(因为您未提供库名的扩展名)。 因此,您需要告诉链接器您想要哪种链接形式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.