静态链接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.alibsqucppconn.so (静态或动态)在哪里? 编译器正在寻找它,并没有找到它。

据推测,这是与/usr/lib/mysqlcppconn-static.a相同的库。 如果是这样,只需删除-lmysqlcppconn 。 或者只是使用-lmysqlcppconn-static (不包含空格),忘记/usr/lib/libmysqlconn-static.a 。 用这样的名字,不应该有相应的.so ,这意味着g ++会静态链接它,即使没有静态链接。 如果在同一目录中同时存在libmysqlconn-static.solibmysqlconn-static.a ,则只需要-static

关于第二个错误(这只是一个警告,但是如果你尝试在其他机器上运行链接的程序,或者甚至在你的机器升级之后都会导致问题):如果你在命令行的任何地方使用了-static就像你现在所做的那样),那么它适用于之后链接的所有文件。 包括您不想静态链接的系统库。 我的猜测是, -static是没有必要的(见上文); 如果是的话,把它放在要静态链接的库之前,并立即放置一个-dynamic (这样以后的库,包括系统库,都将被动态链接)。

你可以试试g++ -static YOUR ARGUMENTS

如果你是来自Windows平台,连接到Boost可以给你一些惊喜。 典型的Boost安装(例如./b2 install )将使动态库和静态库都处于同一个目录中。 通常,这两个库的形式只有扩展名(.so或.a)不同。

Windows支持自动链接 ,这基本上意味着库文件在其前几个字节中包含一些标志,指示它们是用于动态链接还是用于静态链接。 在Linux平台上,情况并非如此,连接器会加载哪个文件(因为您没有提供库名称的扩展名)。 因此,你需要告诉你的链接器你想要的链接的形式。