簡體   English   中英

實用注釋(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 comment(lib, "lib1.lib")注注釋更改為#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。 例如,從這里進行的解釋:

使用#pragma注釋(鏈接器)或#pragma注釋(庫)時,您會在目標文件中獲得一個特殊條目(這是一個特殊的COFF節,通常將其設置為指令位,命名為“ .drectve”)。 鏈接器看到此條目后,將其視為已在鏈接器命令行上進行了切換。

所以:

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

cl t.cpp

相當於

t.cpp:
...

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

當您將/NODEFAULTLIB添加到最后一條注釋時,它將忽略指定為/DEFAULTLIB任何/DEFAULTLIB

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM