[英]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項目設置上運行它:
但是我遇到了一個鏈接器錯誤,例如:
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.