gpt4 book ai didi

c++ - pragma 评论(lib)不起作用

转载 作者:行者123 更新时间:2023-11-28 01:50:42 25 4
gpt4 key购买 nike

给定这个库:

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 项目设置上运行它:

  • /节点故障库
  • 进入:开始
  • 禁用优化 (/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 comment 更改为 #pragma comment(lib, "lib1.lib"), #pragma comment(lib, ".\\lib1.lib") , #pragma comment(lib, "./lib1.lib") 但它们都不起作用。

我还尝试在链接器附加路径中包含 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 的任何内容

关于c++ - pragma 评论(lib)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43131487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com