我有一个问题,我想编译我的应用程序与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 ++会静态链接它,即使没有静态链接。 如果在同一目录中同时存在libmysqlconn-static.so
和libmysqlconn-static.a
,则只需要-static
。
关于第二个错误(这只是一个警告,但是如果你尝试在其他机器上运行链接的程序,或者甚至在你的机器升级之后都会导致问题):如果你在命令行的任何地方使用了-static
就像你现在所做的那样),那么它适用于之后链接的所有文件。 包括您不想静态链接的系统库。 我的猜测是, -static
是没有必要的(见上文); 如果是的话,把它放在要静态链接的库之前,并立即放置一个-dynamic
(这样以后的库,包括系统库,都将被动态链接)。
你可以试试g++ -static YOUR ARGUMENTS
。
如果你是来自Windows平台,连接到Boost可以给你一些惊喜。 典型的Boost安装(例如./b2 install
)将使动态库和静态库都处于同一个目录中。 通常,这两个库的形式只有扩展名(.so或.a)不同。
Windows支持自动链接 ,这基本上意味着库文件在其前几个字节中包含一些标志,指示它们是用于动态链接还是用于静态链接。 在Linux平台上,情况并非如此,连接器会加载哪个文件(因为您没有提供库名称的扩展名)。 因此,你需要告诉你的链接器你想要的链接的形式。