【问题标题】:pragma comment(lib) not working杂注注释(lib)不起作用
【发布时间】:2017-08-25 04:23:12
【问题描述】:

鉴于这个库:

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"),但均无效。

我还尝试在链接器的附加路径中包含 lib1.lib 的路径,然后使用 #pragma comment(lib, "lib1.lib") 或 ``#pragma comment(lib, "lib1.lib")`,没有运气。

事实上,有趣的是,当打开链接器中的 /VERBOSE 时,我没有看到任何链接器尝试使用 #pragma 指令。当然,如果我将 lib1.cpp 或 lib1.lib 添加到项目中,它会起作用,但我正在尝试弄清楚如何使用 pragma 指令......所以,任何人都可以解释这里发生了什么以及如何解决这个问题?

【问题讨论】:

  • 在您的 lib1.h 中,您应该像这样导出该函数:__declspec(dllexport) void foo();
  • @Asesh 这仅适用于 DLL,不是吗?我认为他正在尝试将其用作静态库。
  • @JerryJeremiah 你是对的,我正在尝试导入静态库,而不是共享库。我想到的第一个问题是……为什么链接器完全忽略了 pragma 指令?它至少应该通知找不到路径,对吧?
  • @JerryJeremiah 它适用于 DLL 文件和静态库。可以使用 __declspec(dllimport) 导入导出的方法
  • @Asesh 顾名思义 dllimport 和 dllexport 通常仅在使用 dll 时使用,而不是使用静态库。即使有可能也解决不了任何问题。

标签: c++ visual-studio visual-studio-2015 pragma


【解决方案1】:

不要使用 /NODEFAULTLIB,它基本上指示链接器忽略 lib #pragma。来自here的解释例如:

当你使用#pragma comment(linker) 或#pragma comment(lib) 你会得到一个 目标文件中的特殊条目(通常是特殊的 COFF 部分 命名为“.drectve”并设置了指令位)。一旦链接器看到 该条目将其视为在链接器上给出了开关 命令行。

所以:

t.cpp:
#pragma comment(lib,"advapi32.lib")
...

cl t.cpp

等价于

t.cpp:
...

cl t.cpp /link /DEFAULTLIB:advapi32.lib

当您将/NODEFAULTLIB 添加到最后一条评论时,它将忽略指定为/DEFAULTLIB 的任何内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2020-10-09
    • 2012-09-19
    • 2015-09-14
    相关资源
    最近更新 更多