链接自定义函数而不是crt one

时间:2016-10-28 08:43:37

标签: c gcc visual-c++ crt

我正在开发一个应用程序,该应用程序定义了它自己的printf()以解决不同CRT之间的差异,或者因为其他一些平台没有它。

使用gcc构建应用程序时,这似乎自动工作,并使用自定义printf而不是libc的一个;如果我理解正确,这是因为目标文件/库出现在链接命令中的顺序,或者因为目标文件总是在CRT库之前搜索,是否正确?

我想使用msvc做同样的事情。只需构建项目就可以得到预期的< LNK2005:_printf已经在printf.obj中定义了'因为printf也在msvcrtd.lib中。很公平。我知道/ NODEFAULTLIB但是排除了除了printf之外的所有内容都会导致未解析的引用。我通过其他链接器设置进行了扫描,但无法找到允许这样做的任何内容(除了/ FORCE之外,可能会产生无效的可执行文件'注释并不会让它听起来像是好主意)。模块定义文件docs中也没有任何内容;后者让我觉得有可能创建一个存根库,它包含除了printf之外的msvcrt.lib的所有导出,但这似乎是一个脆弱的解决方案,即使它有效。

最后问题很简单:如何告诉msvc的链接器它应该跳过msvcrt的printf定义并使用我的printf.obj中的那个。基本上/ NODEFAULTFUNCTION:printf左右。只需一个单一可执行文件的答案即可,但我也有兴趣知道在构建dll时是否以及如何完成自定义printf的导出:如何告诉链接器它应该使用导出从我的.lib而不是msvcrt.lib?

编辑我能找到的最简单的回购:创建一个文件main.c:

#include <stdio.h>

int main(int argc, char** argv)
{
  printf("Hello");
  return 0;
}

和文件printf.c:

int printf(const char *fmt, ...)
{
  write(1, "ok\n", 3);
  return 3;
}

对于VS2013(尽管其他版本可能也可以):创建一个新的空C ++项目并添加两个文件然后构建。 (对于gcc:只有gcc main.c printf.c,结果a.out打印出来&#39; ok&#39;)

VS的罪魁祸首是#include:没有它就可以了,但是我还没有找出original code是否允许以某种方式摆脱它。但即使它确实如此,我仍然想知道这是否可以在链接层解决。

0 个答案:

没有答案