【问题标题】:Locate linking location used by visual studio定位 Visual Studio 使用的链接位置
【发布时间】:2013-05-19 16:58:12
【问题描述】:

这似乎是一个常见问题,但我似乎找不到答案:

有没有办法在链接时找到 VS 用来链接特定函数的特定库?

我正在使用 Visual Studio 构建多项目解决方案。 我有一个解决方案(库解决方案),它生成一堆跨多个程序使用的 .lib。这些库之一是从强制大写名称的 Fortran 代码(英特尔 Fortran 77 编译器)生成的。

我将这些库静态链接到我构建应用程序的解决方案中(恰好是在 C++ 中,带有适当的“外部 C”和原型。

我遇到的问题是,我可以删除生成特定函数的库,并且我的程序可以愉快地编译(没问题)和链接(什么垃圾!)。所以我去链接器->输入->附加依赖项中的每个库,并执行一个objdump来寻找函数(fortran中的子程序)名称,但它没有出现。我对所有项目依赖项做同样的事情,但仍然没有骰子。

如果我将库(以及所有函数调用和原型)更改为随机的东西(如 myFunction12345)并重新编译和链接,一切都会按我的预期工作,所以很明显有些东西正在链接中,我找不到.

fwiw 我的函数名称是 AIR

我对解决我的特定问题不太感兴趣,因为我正在学习如何弄清楚 VS 在链接时使用了哪些 LIB。另外,我很想知道是否有一些链接器标志可以抛出警告,或者如果在链接时有多个定义的对象,则会出错。

有什么想法吗?

【问题讨论】:

  • 当你说你的程序编译正常时,我假设你的意思是有一个带有 main 的 C++ 程序,而不是库编译正常。另外,我们是在谈论静态库还是 DLL?
  • 如果编译器对 Fortran 符号使用大写名称,这是非常奇怪且不常见的。你使用哪个编译器?
  • @CUP:库和 C++ 程序(包含 main)都可以编译。该库编译为 .lib,C++ 程序编译并链接。这些库是 .lib(静态链接)库而不是 DLL
  • @VladimirF 我们在英特尔 Fortran 77 编译器中针对此特定库强制将大写作为编译器选项。我们这样做是有历史原因的,但从功能上讲,它与编译默认方式(小写)没有什么不同。通常,fortran 是大小写不变的,因此在链接之前,大写或小写并不重要。当我们从 C 或 C++ 调用子例程时,我们会匹配大小写。我只是编译成小写来测试,但它需要在 C/C++ 端重写相当多的代码,这是我试图避免的。
  • 我应该补充一点,我对解决我的特定问题的问题不太感兴趣,因为我希望找到一个工具或流程来让我在链接时识别冲突。

标签: visual-studio linker fortran


【解决方案1】:

将 /verbose 添加到链接器命令行附加选项。在结果输出中,查找诸如“Found _AIR in xxxx”之类的行。周围的线条应该非常清楚地表明正在发生的事情。

你可能有一个同名的库被从你想要的库之前的库搜索路径中拉入,或者相关符号也可能在默认库中定义。

【讨论】:

  • 或者 Linker/General/Show Progress,它做同样的事情。
  • 这正是我想要的,谢谢!现在看来很明显了。
猜你喜欢
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 2014-01-23
相关资源
最近更新 更多