【发布时间】: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