pragma 评论(lib)不起作用
pragma comment(lib) not working
给定这个库:
lib1.h:
#pragma once
#include <windows.h>
void foo();
lib1.cpp
#include "lib1.h"
void foo() {
MessageBox(NULL, "XXX", "YYY1", MB_OK);
}
使用以下命令在命令行中创建:
cl /c lib1.cpp
lib lib1.obj
然后这个小测试:
#pragma comment(lib, "lib1")
#include "lib1.h"
void start() {
foo();
}
我已经尝试在 windows vs2015 项目设置中 运行 它:
- /NODEFAULTLIB
- 条目:开始
- 优化已禁用 (/Od)
- (禁用安全检查)/GS-
但我遇到了链接器错误,例如:
main.obj : error LNK2019: unresolved external symbol "void __cdecl foo(void)" (?foo@@YAXXZ) referenced in function "void __cdecl start(void)" (?start@@YAXXZ)
我已经尝试将 pragma 注释更改为 #pragma comment(lib, "lib1.lib")
、#pragma comment(lib, ".\lib1.lib")
、#pragma comment(lib, "./lib1.lib")
,其中 none 有效。
我还尝试在链接器附加路径中包含 lib1.lib 的路径,然后使用 #pragma comment(lib, "lib1.lib")
或 ``#pragma comment(lib, "lib1.lib")` , 运气不好。
事实上,有趣的是,在链接器中打开 /VERBOSE 时,我没有看到任何链接器尝试使用 #pragma 指令。当然,如果我在项目中添加 lib1.cpp 或 lib1.lib 它会起作用,但我正在尝试弄清楚如何使用 pragma 指令......所以,任何人都可以解释这里发生了什么以及如何解决这个问题?
不要使用 /NODEFAULTLIB,它基本上指示链接器忽略 lib #pragma。例如来自 here 的解释:
When you use #pragma comment(linker) or #pragma comment(lib) you get a
special entry in the object file (it's a special COFF section usually
named ".drectve" with the directive bit set). Once the linker sees
this entry it treats it as if the switch was given on the linker
command line.
所以:
t.cpp:
#pragma comment(lib,"advapi32.lib")
...
cl t.cpp
相当于
t.cpp:
...
cl t.cpp /link /DEFAULTLIB:advapi32.lib
并且当您将 /NODEFAULTLIB
添加到最后一条评论时,它将忽略指定为 /DEFAULTLIB
的任何内容
给定这个库:
lib1.h:
#pragma once
#include <windows.h>
void foo();
lib1.cpp
#include "lib1.h"
void foo() {
MessageBox(NULL, "XXX", "YYY1", MB_OK);
}
使用以下命令在命令行中创建:
cl /c lib1.cpp
lib lib1.obj
然后这个小测试:
#pragma comment(lib, "lib1")
#include "lib1.h"
void start() {
foo();
}
我已经尝试在 windows vs2015 项目设置中 运行 它:
- /NODEFAULTLIB
- 条目:开始
- 优化已禁用 (/Od)
- (禁用安全检查)/GS-
但我遇到了链接器错误,例如:
main.obj : error LNK2019: unresolved external symbol "void __cdecl foo(void)" (?foo@@YAXXZ) referenced in function "void __cdecl start(void)" (?start@@YAXXZ)
我已经尝试将 pragma 注释更改为 #pragma comment(lib, "lib1.lib")
、#pragma comment(lib, ".\lib1.lib")
、#pragma comment(lib, "./lib1.lib")
,其中 none 有效。
我还尝试在链接器附加路径中包含 lib1.lib 的路径,然后使用 #pragma comment(lib, "lib1.lib")
或 ``#pragma comment(lib, "lib1.lib")` , 运气不好。
事实上,有趣的是,在链接器中打开 /VERBOSE 时,我没有看到任何链接器尝试使用 #pragma 指令。当然,如果我在项目中添加 lib1.cpp 或 lib1.lib 它会起作用,但我正在尝试弄清楚如何使用 pragma 指令......所以,任何人都可以解释这里发生了什么以及如何解决这个问题?
不要使用 /NODEFAULTLIB,它基本上指示链接器忽略 lib #pragma。例如来自 here 的解释:
When you use #pragma comment(linker) or #pragma comment(lib) you get a special entry in the object file (it's a special COFF section usually named ".drectve" with the directive bit set). Once the linker sees this entry it treats it as if the switch was given on the linker command line.
所以:
t.cpp:
#pragma comment(lib,"advapi32.lib")
...
cl t.cpp
相当于
t.cpp:
...
cl t.cpp /link /DEFAULTLIB:advapi32.lib
并且当您将 /NODEFAULTLIB
添加到最后一条评论时,它将忽略指定为 /DEFAULTLIB