C++ “铿锵链接器报告”;找不到符号“;,尽管';nm-m';显示该名称存在于链接到的库中
在OSX(clang)上,在链接阶段,在我的代码中找不到符号(C++ “铿锵链接器报告”;找不到符号“;,尽管';nm-m';显示该名称存在于链接到的库中,c++,boost,linker,clang,C++,Boost,Linker,Clang,在OSX(clang)上,在链接阶段,在我的代码中找不到符号(boost::filesystem::portable\u posix\u name)。下面是一个简短的代码段,其中包含我在代码中调用的函数: if (boost::filesystem::is_directory(settings.parent_path()) && boost::filesystem::portable_posix_name(settings.filename().string())) { ...
boost::filesystem::portable\u posix\u name
)。下面是一个简短的代码段,其中包含我在代码中调用的函数:
if (boost::filesystem::is_directory(settings.parent_path())
&& boost::filesystem::portable_posix_name(settings.filename().string()))
{ ... }
(如果我的代码段中需要更多上下文,请告诉我。)
程序编译和链接时使用的链接器命令行包含以下内容:
-L/Users/administrator/boost\u 1\u 54\u 0/lib-lboost\u文件系统
。。。并且所指示的路径和文件名(libboost_filesystem.a和libboost_filesystem.dylib
)都存在于所指示的路径中
链接器找不到Boost函数Boost::filesystem::portable\u posix\u name(std::string const&)
:
架构x86_64的未定义符号:
“boost::filesystem::portable_posix_name(std::_1::basic_string const&)”
但是,我确实看到该函数存在于相关的.a
和.dylib
文件中:
nm-m./libboost\u filesystem.a
显示00000000000090f0(\uuuuu TEXT,\uuuuuuuuu TEXT)外部的\uuuuuuuznoost10filesystem19portable\u posix\u nameERKSs
,并通过显示运行被破坏的函数名\uuuuuuuzn5boost10filesystem19portable\u posix\u nameERKSs
:
\u boost::filesystem::portable\u posix\u name(std::string const&)
。。。我相信名称前面的下划线是正确的,因为找到的其他函数也有前面的下划线
(.dylib
文件也包含相同的损坏字符串)
我已经确认.a
和.dylib
文件的体系结构都是正确的:otool-hv./libboost\u文件系统。a
通过和(对于.dylib
)显示“x86\u 64
”
为了确保库确实被找到并链接,我在compile命令行中更改了库的名称,如下所示:
-L/Users/administrator/boost\u 1\u 54\u 0/lib-lboost\u filesystemm
(注意文件名末尾的双精度mm
),只需确认返回了一个“library not found”(未找到库)错误,它是:ld:library not found for-lboost\u filesystemm
。我还确认,libboost_filesystem.a
和.dylib
文件系统中唯一出现的文件是给定Boost目录树中的文件(一个在/lib
目录中,另一个在/bin.v2
子目录中具有相同大小和几乎相同的创建日期/时间);另外,更改-L/Users/administrator/boost\u 1\u 54\u 0/lib
行使其成为垃圾会导致出现ld:library not found for-lboost\u filesystem
错误
奇怪的是,当我grepnm-m
输出以显示boost::filesystem::is_directory
时,对于后一个函数,在库的符号表中没有显示任何结果,即使该函数没有链接器错误。在我看来,这似乎是非常倒退的(库中没有出现的函数链接很好,但是库中出现的函数给出了一个链接器错误?)-但这个问题是另一天的问题(而且,可能这个函数实际上会有一个未定义的符号错误,但是由于第一个未定义的符号错误,它没有显示出来)
我的问题是:为什么没有找到此符号,尽管链接了具有正确体系结构的正确库和正确的外部
符号
为了响应@Sebastian的回答,我在这里粘贴链接器的完整命令行。这个命令行是由Qt创建的(这是一个Qt项目) 请注意,
-lboost\u filesystem
参数出现在列出所有对象文件之后
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
-headerpad_max_install_names-Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
-stdlib=libc++-mmacosx version min=10.7-o NewGene.app/Contents/MacOS/NewGene main.o newgenemainwindow.o
newgenecreateoutput.o newgeneselectvariables.o
newgenevariablesummary.o newgenetabwidget.o newgenevariablegroup.o
o newgenevariablegroupsscrollarea.o
newgenevariablestoolbox.o newgenevariablestoolbox.o
newgenevariablesummaryscrollarea.o newgenevariablesummarygroup.o
kadcolumnselectionbox.o timerangebox.o newgenewidget.o
uisettingsmanager.o uimodelmanager.o uidocumentmanager.o
uistatusmanager.o globals.o uimanager.o
settingchangeresponseindicator.o settingchangerequestindicator.o
设置ChangeIndicator.o项目设置ChangeIndicator.o
全局设置ChangeIndicator.o设置ChangeResponseItem.o
settingchangerequestitem.o settingchangeitem.o
项目设置ChangeItem.o全局设置ChangeItem.o
globalsettingchangerequestindicator.o
globalsettingchangeresponseindicator.o
globalsettingchangerequestitem.o globalsettingchangeresponseitem.o
项目设置ChangeRequestIndicator.o
项目设置ChangeResponseIndicator.o
项目设置更改请求项.o项目设置更改响应项.o
modelchangeresponse.o modelchangerequest.o modelchangeindicator.o
modelchangeresponseitem.o modelchangerequestitem.o modelchangeitem.o
uiprojectmanager.o newgenefilenames.o uiloggingmanager.o
o uiallsettings.o uisetting.o uimessager.o
uiinputproject.o uioutputproject.o uiinputmodel.o uioutputmodel.o
uiallprojectsettings.o uimodel.o uiproject.o uiinputprojectsettings.o
uioutputprojectsettings.o uiallglobalsettings.o
uiallglobalsettings_list.o uiinputprojectsettings_list.o
用户界面