我正在开发一个相当大的c ++项目,我可以选择使用clang(3.6)或gcc(5.1)进行编译。
现在项目本身生成了一个可执行文件,它使用了相当多的共享库(作为项目的一部分构建)。
现在当我用gcc编译时,一切都很好,我得到了一个可行的可执行文件。 但是,当我使用clang编译时,在链接可执行文件时会出现链接错误:
/home/{user}/Projects/60ChannelSIP/bin/Clang/opt/swmi/lib/libSystem.so: undefined reference to `boost::program_options::arg'
/home/{user}/Projects/60ChannelSIP/bin/Clang/opt/swmi/lib/libMysql.so: undefined reference to `mysqlpp::Query::str(mysqlpp::SQLQueryParms&)'
/home/{user}/Projects/60ChannelSIP/bin/Clang/opt/swmi/lib/libTfc.so: undefined reference to `std::ios_base::failure::failure(char const*, std::error_code const&)'
/home/{user}/Projects/60ChannelSIP/bin/Clang/opt/swmi/lib/libTfc.so: undefined reference to `boost::gregorian::greg_month::get_month_map_ptr()'
奇怪的是它引用的库编译和链接很好,并且链接器提到的所有必需的库都为可执行文件中的链接阶段配置(为了可读性添加了换行符):
"/usr/bin/ld" -export-dynamic -z relro --hash-style=gnu --hash-style=both --build-id --enable-new-dtags
--eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o /home/{user}/Projects/60ChannelSIP/bin/Clang/opt/swmi/bin/TetraNode
/usr/lib/crt1.o /usr/lib/crti.o /usr/local/bin/../lib/gcc/i686-pc-linux-gnu/5.1.0/crtbegin.o
-L/home/{user}/Projects/60ChannelSIP/bin/Clang/opt/swmi/lib -L/usr/local/bin/../lib/gcc/i686-pc-linux-gnu/5.1.0
-L/usr/local/bin/../lib/gcc/i686-pc-linux-gnu/5.1.0/../../.. -L/usr/local/bin/../lib -L/lib -L/usr/lib -ltcmalloc_minimal -rpath ../lib
-rpath /opt/swmi/lib /home/{user}/Projects/60ChannelSIP/obj/Clang/TetraNode/TmcOperationalMgrCmd.o
/home/{user}/Projects/60ChannelSIP/obj/Clang/TetraNode/TmcDispatchers.o /home/{user}/Projects/60ChannelSIP/obj/Clang/TetraNode/TmcApplication.o
/home/{user}/Projects/60ChannelSIP/obj/Clang/TetraNode/TmcExe.o /home/{user}/Projects/60ChannelSIP/obj/Clang/TetraNode/TestCommand.o
/home/{user}/Projects/60ChannelSIP/obj/Clang/TetraNode/TmcCommand.o /home/{user}/Projects/60ChannelSIP/obj/Clang/TetraNode/TetraNodeTestCmd.o
/home/{user}/Projects/60ChannelSIP/obj/Clang/TetraNode/TmcCopyProtection.o -lInterTnx -lUdpcp -lStatistics -lMysql -lHptl
-lUrlHandling -lTigTnx -lTigTsc -lTig -lTig2Tnx -lTig2Tsc -lTig2 -lNmsCommunications -lWebServerGoAhead -lTetraCapture -lTetraTnx
-lTetraNumberPlan -lTetraBs -lTetra -lTbsComm -lLrrp -lTelephoneTnx -lOmTccTnspV1V2 -lTelephoneTsc -lTelephone -lMptTnx -lMptNumberPlan
-lMptNumberPlanTsc -lMptTsc -lMpt -lE1TelephoneTsc -lE1Telephone -lE1MediaPro -lIsdn -lSipTelephone -lSipGateway -lRohill.Codec
-lConventionalTnx -lConventionalTsc -lConventional -lCommonCallProtocolTsc -lCommonCallProtocol -lAllCallProtocolsNumberPlan
-lResourceMgr -lCallMgr -lTransmissionMgr -lOperationalMgrTmc -lTca -lTnPnP -lSwTcc -lSwmi -lAcelpMixer -lNodeCapabilities
-lProtocolCapabilities -lTig2Mgr -lDatabase -lInternodeMgr -lOperationalMgrTcc -lCallLogger -lTccTnspV2 -lTnspV2 -lTnsp -lIPLinkTetra
-lIPLinkR855 -lIPLinkCore -lTndUtilities -lTfc -lNmea -lVersion -lTmw -lSystem -lRohill.Core -lRohill.SIP -lagent++ -lsnmp++ -lmysqlpp
-lmysqlclient -lrt -lncurses -lcrypt -lxml2 -lcurl -lz -lbz2 -lssl -lcrypto -ldl -luuid -lboost_signals -lboost_system
-lboost_filesystem -lboost_regex -lboost_thread -lboost_iostreams -lboost_program_options -lboost_chrono -lboost_date_time
-lTetraCapture -lTmw -ljansson -lstdc++ -lm -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc/usr/local/bin/../lib/gcc/i686-pc-linux-gnu/5.1.0/crtend.o /usr/lib/crtn.o
我可以发现,链接器所抱怨的所有库后来都在链接器列表中,而不是它所说的具有未定义引用的库。有什么想法吗?
修改
视为gcc& clang命令太大了,不能在这里发布(它会使体长过多),这里是一个link到pastebin。