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");
}