【发布时间】: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