问题标签 [linker]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 函数模板的多个定义
假设一个头文件定义了一个函数模板。现在假设#include
这个头文件有两个实现文件,每个都有一个函数模板的调用。在两个实现文件中,函数模板都使用相同的类型进行实例化。
人们可能期望链接器会抱怨f()
. 具体来说,如果f()
不是模板,那么情况确实如此。
- 为什么链接器不抱怨多个定义
f()
? - 标准中是否规定链接器必须优雅地处理这种情况?换句话说,我可以总是指望类似于上面的程序来编译和链接吗?
- 如果链接器可以足够聪明地消除一组函数模板实例化的歧义,为什么它不能对常规函数做同样的事情,因为它们与实例化函数模板的情况相同?
c++ - 静态或动态链接 CRT、MFC、ATL 等
回到 90 年代,当我第一次开始使用 MFC 时,我曾经动态链接我的应用程序并发布相关的 MFC DLL。这给我带来了一些问题(DLL 地狱!),我改用静态链接 - 不仅适用于 MFC,还适用于 CRT 和 ATL。除了较大的 EXE 文件之外,静态链接从来没有给我带来任何问题——那么其他人遇到过任何缺点吗?是否有充分的理由再次访问动态链接?我的应用程序现在主要是 STL/Boost FWIW。
c++ - 链接器错误 C++ Visual Studio 2005
对于我什至没有直接调用的方法,我在 Visual Studio 中遇到了一大堆链接器错误。我白天是一名 Java 开发人员,但我有一个需要用 C++ 完成的项目,旨在在 Windows 机器上运行。因此,我被困在 Visual Studio 上。
Bascally,我有一个 os 项目,我添加了一个访问器方法。我将该项目编译为 .lib 文件(编译和链接很好)。
然后我有自己的项目使用该库。我已将库包含在 Project->Properties -> Linker -> Input 下,并在 General -> Additional Lib Directories 中设置适当的目录。我已将标头包含在适当的文件中,我只是调用其中一个类的构造函数……甚至没有调用我创建的方法。
代码可以编译,但我得到以下大量链接器错误——主要是 LNK2019 和 LNK2001 错误。我尝试在不同的设置(lib、exe 等)下重新编译,链接器错误似乎只会成倍增加。当我切换回以前的设置时,错误数量仍处于峰值。任何想法如何解决这一问题?
构建日志
构建开始:项目:SpamCapture,配置:调试|Win32
命令行:
创建临时文件“c:\SpamCapture\SpamCapture\SpamCapture\Debug\RSP0000103081740.rsp”,内容为 [ /VERBOSE:LIB /OUT:"C:\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.exe" /INCREMENTAL /LIBPATH: "C:\SpamCapture\Config\Debug\" /MANIFEST /MANIFESTFILE:"Debug\SpamCapture.exe.intermediate.manifest" /NODEFAULTLIB:"libcmtd.lib" /NODEFAULTLIB:"nafxcwd.lib" /DEBUG /PDB:"c :\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.pdb" /SUBSYSTEM:CONSOLE /MACHINE:X86 KeyCapture_Config.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32 .lib uuid.lib odbc32.lib odbccp32.lib
“.\Debug\Interaction.obj”
“.\Debug\InteractionSet.obj”
“.\Debug\LogReader.obj”
".\Debug\SpamCapture.obj"
“.\调试\stdafx.obj”
".\Debug\SpamCapture.res"
".\Debug\SpamCapture.exe.embed.manifest.res" ] 创建命令行 "link.exe @c:\SpamCapture\SpamCapture\SpamCapture\Debug\RSP0000103081740.rsp /NOLOGO /ERRORREPORT:PROMPT"
输出窗口:
正在链接... LINK:警告 LNK4067:入口点不明确;选择 'mainCRTStartup' 搜索库 搜索 C:\SpamCapture\Config\Debug\KeyCapture_Config.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\kernel32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\ lib\winspool.lib:搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib: 搜索 C:
链接器错误从这里开始:
KeyCapture_Config.lib(KeyCapture_ConfigDlg.obj) : 错误 LNK2001: 无法解析的外部符号 "public: virtual int __thiscall CWnd::Create(char const *,char const *,unsigned long,struct tagRECT const &,class CWnd *,unsigned int,struct CCreateContext *)" (?Create@CWnd@@UAEHPBD0KABUtagRECT@@PAV1@IPAUCCreateContext@@@Z)
......更像这样的一堆
KeyCapture_Config.lib(KeyCapture_ConfigDlg.obj) : 错误 LNK2019: 无法解析的外部符号 "public: struct HICON__ * thiscall CWinApp::LoadIconA(unsigned int)const " (?LoadIconA@CWinApp@@QBEPAUHICON @@I@Z) 在函数中引用"公共:__thiscall CKeyCapture_ConfigDlg::CKeyCapture_ConfigDlg(class CWnd *)" (??0CKeyCapture_ConfigDlg@@QAE@PAVCWnd@@@Z)
......更多这样的
(?DoDataExchange@SetupDialog@@MAEXPAVCDataExchange@@@Z) C:\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.exe:致命错误 LNK1120:34 个未解决的外部
结果:
构建日志保存在“file://c:\SpamCapture\SpamCapture\SpamCapture\Debug\BuildLog.htm” SpamCapture - 44 个错误,1 个警告
windows - 如何控制 Windows DLL 从应用程序导入哪些符号?
我正在尝试使用 MSVC 6(复古!)在 Windows 上构建一个共享库(DLL),我有一个特殊的链接问题需要解决。我的共享库必须访问一些全局状态,由加载应用程序控制。
概括地说,我所拥有的是:
应用程序.c:
shared_library.c:
(更新- 我忘记了__declspec(dllexport) int __stdcall
部分,但它在真实代码中)
如何设置 shared_library.dll 以便导出shared_library_method
和导入use_private_value
?
请记住,A)我通常是一个 unix 程序员,并且 B)我在没有 Visual Studio 的情况下这样做;我们的自动化构建基础架构使用 makefile 驱动 MSVC。如果我省略了一些可以更容易回答问题的内容,请发表评论,我会尽快更新。
c++ - std::exception::_Raise 和 std::exception::exception 上的 VC++ 链接器错误
我正在使用 Visual C++ 2005 Express Edition 并收到以下链接器错误:
我在生成的代码中关闭了异常,并且在包含矢量头文件之前正在使用:
一些谷歌结果出现了一些东西,但没有“啊哈!” 对我有用的解决方案。
编辑:
如前所述,“_HAS_EXCEPTIONS 0”本身并不会关闭异常。它的作用是,至少在向量头文件中,是在异常对象上调用 _Raise,而不是调用 C++“抛出”。就我而言,它无法链接到异常对象的 _Raise 函数,因为我没有包含正确的库。但是,那个库是什么并不明显。
c - 为什么我的编译防护不能防止多个定义包含?
我有一个头文件 xh,它包含在多个 *.c 源文件中。这个头文件定义了一些结构变量。
我在头文件的开头放置了多个包含防止保护:
在构建时,我得到与多个定义相关的链接器错误。我明白这个问题。
不会像我一样在头文件顶部设置多重包含防止保护,防止头文件 xh 的多重包含,从而避免 xh 中存在的变量的多个定义?
#pragma
一次在这个特定的编译器上不起作用,那么解决方案是什么?有人将这个答案发布到了类似的问题上。它似乎对我不起作用。这个解决方案是如何工作的?
c++ - C++:如何链接 libA.so 而不是 libA-XYZso
我有一个我开发的库 A。当我在机器上部署它时,对应的libA.so和libA-XYZso被放入 /usr/lib (XYZ 是版本号)。
现在我开发了一个库 B,它使用 A。当我链接 B 时,我使用标志 -lA。然后“ ldd libB.so ”给了我:
我的问题是,当我发布新版本的 A (XYZZ) 时,我还必须发布新版本的 B。否则,安装最新 A 的人将无法安装 B,而 B 将寻找 XYZ 版本这不存在。
我该如何解决这个问题?我如何告诉 B 寻找 libA.so 而不是 libA-XYZso ?或者这样做是错误的?甚至不安全?
更新 1:库 A(我从别人那里继承的)使用自动工具。
更新 2:当我构建库 A 时,我可以看到:"-Wl,-soname -Wl,libA-0.6.1.so"。如果我理解正确,这意味着我们将 soname 强制为libA-0.6.1.so。是对的吗 ?现在我的问题是我不知道如何在使用自动工具的项目中修改这种行为。我用谷歌搜索了一段时间,但找不到任何有用的信息。我应该修改 configure.in 还是 Makefile.am ?
c++ - 使用 VC++ 2008 编译引用 STLport-5.1.4 的应用程序时出现 LNK2001 错误
我提前为这篇长文道歉......
当我们在 VS 菜单 > 工具 > 选项 > VC++ 目录 > 包含和库文件的目录下列出 STLPort 包含和库目录时,我曾经能够构建我们的 VC++ 解决方案(我们在 VS 2008 上)。但是,我们希望过渡到完全依赖 .vcproj 和 .sln 文件的构建过程。与必须在每台开发 PC 上单独配置的 VS 选项不同,这些可以检查到源代码控制中。我们通过将包含目录添加到每个项目的属性页 > 配置属性 > C/C++ > 常规 > 附加包含目录和库目录到链接器 > 常规 > 附加库目录来处理大多数库的转换。
不幸的是,这种方法不适用于 STLPort。我们在链接期间收到 LNK2019 和 LNK2001 错误:
这发生在将可执行项目链接到作为库项目的依赖项时。奇怪的是,在链接库项目本身时不会发生这种情况。有任何想法吗?
c++ - iostream 链接器错误
我有一些旧的 C 代码,我想与一些 C++ 代码结合使用。
过去的 C 代码包括以下内容:
现在我试图让它像这样使用 C++ 和 iostream:
但是我在编译时不断收到以下链接器错误:
[链接器错误] 未定义对 `std::string::size() const' 的引用
[链接器错误] 对 `std::string::operator[](unsigned int) const' 的未定义引用
[链接器错误] 对 `std::string::operator[](unsigned int) const' 的未定义引用
[链接器错误] 对 `std::string::operator[](unsigned int) const' 的未定义引用
[链接器错误] 未定义对 `std::ios_base::Init::Init()' 的引用
[链接器错误] 未定义对 `std::ios_base::Init::~Init()' 的引用
ld 返回 1 个退出状态
我该如何解决这个问题?
编辑:我的编译器是 Dev-C++ 4.9.9.2
c++ - g ++部分链接而不是档案?
我对 C++ 构建流程很陌生,我正在考虑切换到对我的库使用部分链接而不是创建ar
档案。我希望在不可避免的最终编译步骤中减少链接时间,并且我认为部分链接一些库一次可以节省我在最后一步链接所有内容的时间。
我描述的可能吗?我认为它应该是大体上的东西ld -Ur -o mylib.o [components]
。是否有我没有考虑到的重要构建注意事项?