visual studio c链接器换行选项?

visual studio c链接器换行选项?,c,visual-studio,linker,cmocka,C,Visual Studio,Linker,Cmocka,从这篇文章中: 这是通过使用--wrap链接器选项完成的,该选项将wrapped函数的名称作为参数。如果测试是使用gcc编译的,则调用可能如下所示: $gcc-g-Wl,--wrap=chef\u cook water\u test.c chef.c 在visual studio中编译C项目时如何执行此操作?MSVC链接器中的/ALTERNATENAME选项可以模拟-ld中的--wrap 我们从两个编译单元开始,比如从foo.c编译的foo.o,其外部函数在foo.h中声明,以及从main.c中

从这篇文章中:

这是通过使用
--wrap
链接器选项完成的,该选项将wrapped函数的名称作为参数。如果测试是使用gcc编译的,则调用可能如下所示:

$gcc-g-Wl,--wrap=chef\u cook water\u test.c chef.c

在visual studio中编译C项目时如何执行此操作?

MSVC链接器中的
/ALTERNATENAME
选项可以模拟
-ld
中的
--wrap

我们从两个编译单元开始,比如从
foo.c
编译的
foo.o
,其外部函数在
foo.h
中声明,以及从
main.c
中声明的
main.o
。 (如果
foo
被编译成一个库,事情不会有太大变化。)

让我解释一下这里发生了什么:

  • 通过
    #define foo real\u foo
    foo.h
    中的函数声明修改为
    int real\u foo()
  • 但是,
    foo.o
    中的符号仍然以
    int foo()
    命名,而不是别名
    int real\u foo()
    。这就是为什么我们需要
    /alternatename
    链接器开关
  • “/alternatename:real\u foo=foo”
    告诉链接器,如果找不到名为
    real\u foo
    的符号,请在抛出错误之前再次尝试
    foo
  • 显然,
    int real\u foo()
    没有定义。MSVC链接器将搜索
    int foo()
    ,并在每次出现
    int real\u foo()
    时链接它
  • 由于上一个实现已被别名化,现在我们通过宏将
    int foo()
    重定向到新实现:

    int wrap_foo() {
        return real_foo() + 1;
    }
    #define foo wrap_foo
    
    我们到此为止。最后,
    main.cpp
    看起来像:

    #include <stdio.h>
    
    #define foo real_foo
    #include "foo.h"
    #undef foo
    #pragma comment(linker, "/alternatename:real_foo=foo")
    
    int wrap_foo() {
        return real_foo() + 1;
    }
    #define foo wrap_foo
    
    int main() {
        int x = foo();
        printf("%s\n", x ? "wrapped" : "original");
    }
    
    #包括
    #定义foo real\u foo
    #包括“foo.h”
    #undef foo
    #pragma注释(链接器,“/alternatename:real\u foo=foo”)
    int wrap_foo(){
    返回real_foo()+1;
    }
    #定义foo wrap\u foo
    int main(){
    intx=foo();
    printf(“%s\n”,x?”包装为“原件”);
    }
    

    内置在MSVC中,它将输出“wrapped”。

    +1这也是我想知道的,在VS(即MSVC编译器)中,您似乎只能使用#defines手动覆盖实际实现。
    int wrap_foo() {
        return real_foo() + 1;
    }
    #define foo wrap_foo
    
    #include <stdio.h>
    
    #define foo real_foo
    #include "foo.h"
    #undef foo
    #pragma comment(linker, "/alternatename:real_foo=foo")
    
    int wrap_foo() {
        return real_foo() + 1;
    }
    #define foo wrap_foo
    
    int main() {
        int x = foo();
        printf("%s\n", x ? "wrapped" : "original");
    }