Visual Studio 未包含库中的符号

3vpjnl9f  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(183)

我一直在Visual Studio 2022中将一个大型的C++ Windows应用程序更新为几个静态库。这个想法是将部分代码共享给外部开发人员,而不是共享项目的完整C++文件。只有部分代码会被共享,其余的将是.lib和.h。
整个解决方案的结构为:

  • 外部LIB
  • 库1 LIB -从外部LIB引用.h
  • 应用程序EXE -使用上述库

构建应用程序EXE时,链接失败,并出现数千个错误,即外部LIB中缺少符号。“LNK 2001 unresolved external symbol“__declspec(dllimport)public:bool __此调用...”

1>Common.lib(LocalizedString.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: bool __thiscall cocos2d::Value::isNull(void)const " (__imp_?isNull@Value@cocos2d@@QBE_NXZ)
1>  Hint on symbols that are defined and could potentially match:
1>    "__declspec(dllimport) public: bool __thiscall cocos2d::Data::isNull(void)const " (__imp_?isNull@Data@cocos2d@@QBE_NXZ)

EXE配置为包含所有库(在VS项目设置中配置:所有项目都是使用__cdecl(/Gd)和多线程调试DLL(/MDd)生成的。
如果我在EXE代码中添加一些被引用到“unresolved external symbol”错误中的符号的伪声明,Visual Studio会添加这些符号,我可以看到错误的数量在减少。但这不是一个好的解决方案...看起来Visual Studio似乎是自动添加所有符号的。
我相信这整个问题可能与以下内容有关。当构建我的库时,我得到以下“警告LNK 4006:XXXX已在XXXXX.lib(xxhash.obj)中定义;已忽略第二个定义”。
我尝试过不同的项目设置,如“链接库依赖项:是的”。但似乎没有什么能解决它。
我被困了两天了......有人能保存我吗?

hgqdbh6s

hgqdbh6s1#

发现问题。外部库中有一个隐藏的定义,将dllimport添加到每个外部类中。

#if defined(CC_STATIC)
    #define CC_DLL
#else
#if defined(_USRDLL)
    #define CC_DLL     __declspec(dllexport)
#else         /* use a DLL library */
    #define CC_DLL     __declspec(dllimport)
#endif
#endif

相关问题